Глобальные переменные в классе Controller переопределяются при открытии последней сессии - PullRequest
0 голосов
/ 02 мая 2019

Я разработал приложение с использованием Spring-MVC и Hibernate, который имеет страницу регистрации.Когда пользователь пытается зарегистрироваться, приложение отправляет 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 голосов
/ 02 мая 2019

Spring REST-контроллеры всегда имеют вид синглетонов (@Controller подразумевает это). Вы НЕ должны повторно использовать частные переменные / поля уровня класса при вызове метода.

Если у вас есть глобальные проблемы, которые вам необходимо решить / посетить за рамками одного запроса, обязательно разделите их на разные классы.

В противном случае вся область изменения, содержащаяся в аннотированных методах @RequestMapping, должна быть локальной для метода / функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...