控制器类中的全局变量会在打开最新会话的情况下被覆盖

时间:2019-05-02 09:07:10

标签: java spring spring-mvc

我已经使用spring-MVC和hibernate开发了一个应用程序,该应用程序具有注册页面。当用户尝试注册时,应用程序向用户邮件发送OTP,并且我已将应用程序发送的该OTP保留在控制器类中作为全局变量。因此,这里的问题是,当两个用户同时访问时,最新请求的用户otp覆盖了旧用户,并且由于该第一个用户无法注册。

1> spring是否为每个访问应用程序的用户维护单独的会话?如果没有,如何解决此问题?。

请找到以下代码。

控制器类:

package com.uday;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.http.HttpServletRequest;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ControllerSignUp_Login {

    private final Login_DetailsDao dao;
    private Login_Details ld = new Login_Details();
    private String OtpMailed = "";
    private MailSendTest mailSender;
    private int chances = 4;
    private String emailAdd;

    public ControllerSignUp_Login(Login_DetailsDao login_DetailsDao, MailSendTest mailSender) {
        this.dao = login_DetailsDao;
        this.mailSender = mailSender;
    }

    @RequestMapping("/hello")
    @Transactional
    public String diaplay(@RequestParam("name") String name, @RequestParam("pass") String pass, Model m) {
        if (dao.isLogoinSuccessfull(name, pass)) {
            m.addAttribute("message", "Hello " + name + " You are successfully logged in");
            return "Success";
        } else {
            m.addAttribute("message", "Cannot validate given details.Please try again");
            return "login";
        }
    }

    @RequestMapping("/SignUp")
    public String redirect() {
        System.out.println("ControllerSignUp_Login.display()");
        chances = 4;
        return "signup";
    }

    @RequestMapping("/login")
    public String display() {
        System.out.println("ControllerSignUp_Login.display()");
        return "login";
    }

    @RequestMapping("/updateDetails")
    @Transactional
    public String display(HttpServletRequest req, Model M) {
        String firstName = req.getParameter("firstName");
        String lastName = req.getParameter("lastName");
        String mobileNo = req.getParameter("mobileNo");
        String address = req.getParameter("address");
        String email = req.getParameter("email");
        String password = req.getParameter("password");
        if (checkLength(firstName) && checkLength(lastName) && checkLength(mobileNo) && checkLength(address)
                && checkLength(email) && checkLength(password)) {

            ld.setFirstName(firstName);
            ld.setLastName(lastName);
            ld.setEmail(email);
            ld.setAddress(address);
            ld.setMobileNo(mobileNo);
            ld.setPassword(password);
            if (dao.validateMobileAndEmail(mobileNo, email)) {
                doSendEmail(email);
                M.addAttribute("cMessage", false);
                return "ValidationPage";
            } else {
                M.addAttribute("message", "MobileNo/Email is already registered");
                return "signup";
            }

        } else {
            M.addAttribute("message", "SignUp Failed !! All details are mandatory.");
            return "signup";

        }
    }

    @RequestMapping("/Home")
    public String displayy() {
        return "Home";
    }

    @RequestMapping("/")
    public String display1() {
        return "login";
    }

    public boolean checkLength(String s) {
        if (s != null && s.length() > 0) {
            return true;
        }
        return false;

    }

    @Transactional
    @RequestMapping("/submitToDB")
    public String submitToDataBase(HttpServletRequest req, Model M) {

        String otp = req.getParameter("otp");
        System.out.println("ControllerSignUp_Login.submitToDataBase()" + otp);
        if (OtpMailed.equals(otp)) {
            dao.saveEmployee(ld);
            chances = 4;
            M.addAttribute("message", "SignUp Successfull !! Thank You");
            M.addAttribute("displayLogin", true);
            return "Success";
        } else {
            if (chances != 1) {
                chances = chances - 1;
                M.addAttribute("message", chances + " Chances Left");
                return "ValidationPage";
            } else {
                chances = 4;
                M.addAttribute("message", "Authorization failed");
                return "signup";
            }

        }

    }

    @RequestMapping("/validate")
    public String validateOtp() {
        return "Success";
    }

    public String generateOtp() {
        String otp = "";
        for (int i = 0; i < 4; i++) {
            Double d = Math.ceil(Math.random() * 10);
            int value = d.intValue();
            if (value == 10) {
                otp = otp + 1;
            } else {
                otp = otp + value;
            }
        }
        return otp;

    }

    public void doSendEmail(String mail) {
        try {
            this.emailAdd = mail;
            String recipientAddress = mail;
            String subject = "One Time Verification <Uday>";
            String otpGenerated = generateOtp();
            this.OtpMailed = otpGenerated;
            String message = "Please use this OTP " + otpGenerated + "  to signup. ";
            mailSender.Send("xxxxxxxxx@gmail.com", "lxrxnxnhmyclvzxs", recipientAddress, subject, message);
        } catch (AddressException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @RequestMapping("/resend")
    public String resend(Model m) {
        doSendEmail(this.emailAdd);
        m.addAttribute("message", chances + " Chances Left");
        return "ValidationPage";
    }

}

1 个答案:

答案 0 :(得分:0)

Spring REST控制器的作用域始终为单例(@Controller注释暗示了这一点)。您应该在方法调用时重用私有类级别的变量/字段。

如果您有全局性顾虑,则需要在单个请求范围之外进行管理/访问,请确保将它们分为不同的类。

否则,在@RequestMapping注释的方法内部进行的整个修改范围应为method / function-local。