繁体   English   中英

Java Spring-创建一个用于用户处理的会话

[英]Java Spring - creating a single session for user handling

我正在开发一个应用程序,可能在会话处理中遇到了一个错误。

本质上有登录用户,注销用户和获取存储的用户。

-但是我认为当我调用这些函数时,每次都会创建一个不同的会话吗? 所以我试图创建一个控制器,可以创建一个会话并从中读取..但是我遇到了类似的错误-将getSession更改为static。

在我的主应用程序中,我将如何调用这些功能,并且只传递一个会话?

会话控制器看起来像这样。

package controller;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.json.simple.JSONObject;

@SuppressWarnings("serial")
public class SessionController extends HttpServlet{

    HttpServletRequest request;

    SessionController(HttpServletRequest request){      
        HttpSession session = request.getSession(true);
    }

    HttpSession getSession(){
        HttpSession session = this.request.getSession(true);        
        return session;
    }

    @SuppressWarnings("unchecked")
    public static JSONObject getLoggedUser() {
        session = getSession();

        JSONObject user = (JSONObject) session.getAttribute("user");

        System.out.println("session getLoggedUser>>>"+session);
        System.out.println("---session login user>>>"+session.getAttribute("user"));

        return user;
    }   

    public static void logUser(JSONObject object) {
        session = getSession();
        //store user details
        session.setAttribute("user", object);

        System.out.println("session login>>>"+session());
        System.out.println("---session login user>>>"+session.getAttribute("user"));
    }

    public static void logOutUser() {
        session = getSession();
        session.removeAttribute("user");

        System.out.println("session logout>>>"+session);
        System.out.println("---session login user>>>"+session.getAttribute("user"));
    }

}

在MyService中,我有一个这样的登录方法

@SuppressWarnings("unchecked")
@RequestMapping(value = "/login", method = RequestMethod.GET)
@CrossOrigin(origins = {"*"})
@ResponseBody
public ResponseEntity<?> login(
        @RequestParam(value="email", required=false, defaultValue="email") String email,
        @RequestParam(value="password", required=false, defaultValue="password") String password, 
        HttpServletRequest request
        ) throws  Exception {

            System.out.println("email email>>>"+email);
            System.out.println("email password>>>"+password);

            //find matching account with email
            TblLogin checkAccount = tblLoginRepository.findByEmail(email);

            if (checkAccount != null) {     
                //do the passwords match
                if(passwordEncoder.matches(password, checkAccount.getPassword())) {
                    // Encode new password and store it
                    System.out.println("PASSWORD MATCH");

                    //build clean user object
                    JSONObject userDetails = new JSONObject();

                    //create user object
                    userDetails.put("id", checkAccount.getId());
                    userDetails.put("email", checkAccount.getEmail());
                    userDetails.put("password", checkAccount.getPassword());
                    userDetails.put("pin", checkAccount.getPin());

                        //attempt look up to get patient information and append to response
                        try {
                            TblPatient extInformation = tblPatientRepository.findByPatientID(checkAccount.getPin());

                            userDetails.put("forename", extInformation.getForename());
                            userDetails.put("surname", extInformation.getSurname());
                            userDetails.put("dateOfBirth", extInformation.getDateOfBirth());
                            userDetails.put("genderID", extInformation.getGenderID());
                        }
                        catch (Exception e) {
                            userDetails.put("forename", null);
                            userDetails.put("surname", null);
                            userDetails.put("dateOfBirth", null);
                            userDetails.put("genderID", null);
                        }

                    //store user in session
                    SessionController mySession = new SessionController(request);
                    mySession.logUser(userDetails);

                    //userDetails.put("session", session);
                    //System.out.println("session>>>"+session.getAttribute("user"));
                    //System.out.println("newAcc>>>"+checkAccount);

                    JSONObject response = ResponseWrapper(null, "success", "User found login succesful");                           
                    return new ResponseEntity<>(response, HttpStatus.OK);

                } else {
                    //create error response                         
                    JSONObject response = ResponseWrapper(null, "error", "User passwords do not match");
                    //System.out.println("user PASSWORD error >>>"+response);
                    return new ResponseEntity<>(response, HttpStatus.OK);
                }
            } else{
                //create error response
                JSONObject response = ResponseWrapper(null, "error", "User has not been found");
                //System.out.println("user does not exist >>>"+response);
                return new ResponseEntity<>(response, HttpStatus.OK);
            }               
}

我需要做类似的事情吗

HttpSession mySession = new SessionController();

更新1。

我有最新的代码库,如下所示。

getHome-将在会话中查询存储的用户

登录-将在会话中创建用户

注销-将删除会话中的用户

MyService类-现在我需要将mySession存储为全局变量-并仅将其构建一次? 在MyService控制器中的哪个位置,但它需要请求?

package controller;


@RestController
public class MyService {


    //api/getHome
    @SuppressWarnings("unused")
    @RequestMapping(value = {"/api/getHome"}, method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    public ResponseEntity<?> getHome(
            HttpServletRequest request
            ) throws Exception { 


            SessionController mySession = new SessionController(request);
            JSONObject user = mySession.getLoggedUser();
            System.out.println("logged in user"+ user);


                //get Home Data
                MyApiHome myApiHome = new MyApiHome();
                JSONArray data = myApiHome.getHomeData();
                System.out.println("myHomedata"+ data);

                JSONObject response = ResponseWrapper(data, "success", "Fetching home data");
                return new ResponseEntity<>(response, HttpStatus.OK);
            //getHome service 
    }

    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    @ResponseBody
    public ResponseEntity<?> login(
            @RequestParam(value="email", required=false, defaultValue="email") String email,
            @RequestParam(value="password", required=false, defaultValue="password") String password, 
            HttpServletRequest request
            ) throws  Exception {

                System.out.println("email email>>>"+email);
                System.out.println("email password>>>"+password);

                //find matching account with email
                TblLogin checkAccount = tblLoginRepository.findByEmail(email);

                if (checkAccount != null) {     
                    //do the passwords match
                    if(passwordEncoder.matches(password, checkAccount.getPassword())) {
                        // Encode new password and store it
                        System.out.println("PASSWORD MATCH");

                        JSONObject userDetails = getUserData(checkAccount);


                        //store user in session 
                        SessionController mySession = new SessionController(request);
                        JSONObject user = mySession.logUser(userDetails);
                        System.out.println("logged in user"+ user);

                        JSONObject response = ResponseWrapper(null, "success", "User found login succesful");                           
                        return new ResponseEntity<>(response, HttpStatus.OK);

                    } else {
                        //create error response                         
                        JSONObject response = ResponseWrapper(null, "error", "User passwords do not match");
                        //System.out.println("user PASSWORD error >>>"+response);
                        return new ResponseEntity<>(response, HttpStatus.OK);
                    }
                } else{
                    //create error response
                    JSONObject response = ResponseWrapper(null, "error", "User has not been found");
                    //System.out.println("user does not exist >>>"+response);
                    return new ResponseEntity<>(response, HttpStatus.OK);
                }               
    }

    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    public ResponseEntity<?> logout(
            HttpServletRequest request
            ) throws  Exception {

            //List<TblLogin> acc = (List<TblLogin>) session.getAttribute("user");
            //HttpSession session = request.getSession();
            //session.removeAttribute("user");          

            //log user out of session
        //SessionController.logOutUser(request);

    SessionController mySession = new SessionController(request);
    JSONObject user = mySession.logOutUser();

            //create success response
            JSONObject response = ResponseWrapper(null, "success", "User logged out");                          
            return new ResponseEntity<>(response, HttpStatus.OK);
    }


}

这就是我的SessionController的样子。

package controller;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.json.simple.JSONObject;

@SuppressWarnings("serial")
public class SessionController {

    private HttpServletRequest request;

    SessionController(HttpServletRequest request){      
        //HttpSession session = request.getSession(true);
        this.request = request;
    }   

    HttpSession getSession(){
        HttpSession session =  this.request.getSession(true);   
        return session;
    }

    @SuppressWarnings("unchecked")
    public JSONObject getLoggedUser() {
        HttpSession session = getSession();

        JSONObject user = (JSONObject) session.getAttribute("user");

        System.out.println("session getLoggedUser>>>"+session);
        System.out.println("---session login user>>>"+session.getAttribute("user"));

        return user;
    }   

    public JSONObject logUser(JSONObject object) {
        HttpSession session = getSession();
        //store user details
        session.setAttribute("user", object);

        JSONObject storedUser = (JSONObject) session.getAttribute("user");
        System.out.println("session login>>>"+session);
        System.out.println("---session login user>>>"+storedUser);

        return storedUser;
    }

    public void logOutUser() {
        HttpSession session = getSession();
        session.invalidate();
        //session.removeAttribute("user");

        System.out.println("session logout>>>"+session);
        System.out.println("---session login user>>>"+session.getAttribute("user")); 
        return null;
    }

}

您误会了,该会话仅在登录后每次创建一次。 用户会话是在您的服务类mySession.logUser(userDetails);上创建的mySession.logUser(userDetails);

session.invalidate()session.removeAttribute("user")更可取

我设法通过仅一次创建会话来解决此问题。 因此,发生的事情是我无意间获得了/设置了一个新的会话,而不是仅仅查看一个会话。

-因此会话控制器非常简单。

SessionController.java

package controller;

import javax.servlet.http.HttpSession;
import org.json.simple.JSONObject;

public class SessionController {

    SessionController(){      
    }   

    public static JSONObject getLoggedUser(HttpSession session) {
        JSONObject storedUser = (JSONObject) session.getAttribute("user");
        return storedUser;
    }   

    public static JSONObject logUser(JSONObject object, HttpSession session) {
        //store user details
        session.setAttribute("user", object);
        JSONObject storedUser = (JSONObject) session.getAttribute("user");
        return storedUser;
    }

    public static JSONObject logOutUser(HttpSession session) {
        session.invalidate();
        return null;
    }
}

现在在我的服务控制器上-在这里,我创建一个会话,然后通过这些会话方法来泵送该会话。

MyService.java

package controller;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import java.security.SecureRandom;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import freemarker.template.Configuration;
import services.MailService;
import services.SimpleEmailService;
import domain.TblLogin;
import repo.TblLoginRepository;

import domain.TblPatient;
import repo.TblPatientRepository;

@RestController
public class MyService {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private Configuration fmConfiguration; 

    @Autowired
    private PasswordEncoder passwordEncoder;    

    @Autowired
    private TblLoginRepository tblLoginRepository;

    @Autowired
    private TblPatientRepository tblPatientRepository;

    private HttpSession session;

    MyService(){        
    }


    //api/getHome
    @RequestMapping(value = {"/api/getHome"}, method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    public ResponseEntity<?> getHome(
            //HttpServletRequest request
            ) throws Exception {

                try {
                    //get logged in user from session
                    JSONObject user = SessionController.getLoggedUser(this.session);
                }
                catch (Exception e) {

                }

                //get Home Data
                MyApiHome myApiHome = new MyApiHome();
                JSONArray data = myApiHome.getHomeData();

                JSONObject response = ResponseWrapper(data, "success", "Fetching home data");
                return new ResponseEntity<>(response, HttpStatus.OK);
            //getHome service 
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    @ResponseBody
    public ResponseEntity<?> login(
            @RequestParam(value="email", required=false, defaultValue="email") String email,
            @RequestParam(value="password", required=false, defaultValue="password") String password, 
            HttpServletRequest request
            ) throws  Exception {

                //find matching account with email
                TblLogin checkAccount = tblLoginRepository.findByEmail(email);

                if (checkAccount != null) {

                    //do the passwords match
                    if(passwordEncoder.matches(password, checkAccount.getPassword())) {
                        // Encode new password and store it

                        JSONObject userDetails = getUserData(checkAccount);

                        //create ONE session
                        this.session = request.getSession(true);

                        //store user in session
                        SessionController.logUser(userDetails, this.session);                                           
                        JSONObject response = ResponseWrapper(null, "success", "User found login succesful");                           
                        return new ResponseEntity<>(response, HttpStatus.OK);

                    } else {
                        //create error response                         
                        JSONObject response = ResponseWrapper(null, "error", "User passwords do not match");
                        return new ResponseEntity<>(response, HttpStatus.OK);
                    }
                } else{
                    //create error response
                    JSONObject response = ResponseWrapper(null, "error", "User has not been found");
                    return new ResponseEntity<>(response, HttpStatus.OK);
                }               
    }

    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    @CrossOrigin(origins = {"*"})
    public ResponseEntity<?> logout(
            ) throws  Exception {

            //logout user
            SessionController.logOutUser(this.session);     

            //create success response
            JSONObject response = ResponseWrapper(null, "success", "User logged out");                          
            return new ResponseEntity<>(response, HttpStatus.OK);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM