2017-09-11 20 views
0

我正在處理應用程序,並且可能遇到會話處理中的錯誤。Java Spring - 爲用戶處理創建單個會話

基本上有登錄用戶,註銷用戶和獲取存儲的用戶。

- 但我想當我調用函數時,它會每次創建一個不同的會話?所以我想創建一個控制器,可以創建一個會話,並從此讀取..但我越來越像錯誤 - 更改getSession靜態..

在我的主要應用程序我將如何調用這些函數,只是通過一個會話?

會話控制器看起來像這樣。

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作爲全局變量存儲 - 並讓它生成JUST ONCE?在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; 
    } 

} 
+0

會話登錄>>> org.apache.cata[email protected] 會議getLoggedUser >>> [email protected] –

+0

這樣的會議是不同的吧? StandardSessionFacade @ –

回答

0

我已經成功通過僅僅一次創建會話來解決該問題。所以發生了什麼是我無意中得到/設置一個新的會話,而不是僅僅審查一個會話。

- 這樣的會話控制器是相當簡單..

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); 
    } 

} 
0

您誤會了,會話只會在登錄後創建一次。用戶會話是在您的服務類創建mySession.logUser(userDetails);

session.invalidate(),但最好不是session.removeAttribute("user")

+0

註釋不適用於擴展討論或調試會話;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/154166/discussion-on-answer-by-kevenlolo-java-spring-creating-a-single-session-for-us) 。如果在本次討論中獲得有用的信息,則應將其編輯到答案中。 –

+0

我很擔心我無法解決此問題..我不確定如果我無法將用戶存儲在會話中,我將要執行的操作。 –

+1

我想我修好了。 –