用户Session相关模块重构
生活随笔
收集整理的這篇文章主要介紹了
用户Session相关模块重构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們就對現有的登陸相關的代碼,進行改造,全部改成單點登陸,廢棄session,那這個廢棄SESSION呢就是廢棄原有servlet里面提供的session,把它放到redis里面,redis里面的session server,其實是一個帶引號的session,我們開始改造,把Session去掉,改成HttpServletRequest,我們更新完之后,我們要把新的信息,set過去,那么現在怎么做呢,其實我們把這個信息重新放回去就可以了,這樣在我們更新用戶信息的時候,更新完之后,我們就會更新這個session,并且設置他的有效期
package com.learn.controller.portal;import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.learn.common.Const;
import com.learn.common.ResponseCode;
import com.learn.common.ServerResponse;
import com.learn.pojo.User;
import com.learn.service.IUserService;
import com.learn.util.CookieUtil;
import com.learn.util.JsonUtil;
import com.learn.util.RedisShardedPoolUtil;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;/*** * @author Leon.Sun**/
@Controller
@RequestMapping("/user/")
public class UserController {@Autowiredprivate IUserService iUserService;/*** 用戶登錄* @param username* @param password* @param session* @return*/@RequestMapping(value = "login.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> login(String username, String password, HttpSession session, HttpServletResponse httpServletResponse){ServerResponse<User> response = iUserService.login(username,password);if(response.isSuccess()){// session.setAttribute(Const.CURRENT_USER,response.getData());CookieUtil.writeLoginToken(httpServletResponse,session.getId());RedisShardedPoolUtil.setEx(session.getId(), JsonUtil.obj2String(response.getData()),Const.RedisCacheExtime.REDIS_SESSION_EXTIME);}return response;}@RequestMapping(value = "logout.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse){String loginToken = CookieUtil.readLoginToken(httpServletRequest);CookieUtil.delLoginToken(httpServletRequest,httpServletResponse);RedisShardedPoolUtil.del(loginToken);// session.removeAttribute(Const.CURRENT_USER);return ServerResponse.createBySuccess();}@RequestMapping(value = "register.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> register(User user){return iUserService.register(user);}@RequestMapping(value = "check_valid.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> checkValid(String str,String type){return iUserService.checkValid(str,type);}@RequestMapping(value = "get_user_info.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> getUserInfo(HttpServletRequest httpServletRequest){String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User user = JsonUtil.string2Obj(userJsonStr,User.class);if(user != null){return ServerResponse.createBySuccess(user);}return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}@RequestMapping(value = "forget_get_question.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> forgetGetQuestion(String username){return iUserService.selectQuestion(username);}@RequestMapping(value = "forget_check_answer.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> forgetCheckAnswer(String username,String question,String answer){return iUserService.checkAnswer(username,question,answer);}@RequestMapping(value = "forget_reset_password.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> forgetRestPassword(String username,String passwordNew,String forgetToken){return iUserService.forgetResetPassword(username,passwordNew,forgetToken);}@RequestMapping(value = "reset_password.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<String> resetPassword(HttpServletRequest httpServletRequest,String passwordOld,String passwordNew){
// User user = (User)session.getAttribute(Const.CURRENT_USER);String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User user = JsonUtil.string2Obj(userJsonStr,User.class);if(user == null){return ServerResponse.createByErrorMessage("用戶未登錄");}return iUserService.resetPassword(passwordOld,passwordNew,user);}@RequestMapping(value = "update_information.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> update_information(HttpServletRequest httpServletRequest,User user){String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User currentUser = JsonUtil.string2Obj(userJsonStr,User.class);if(currentUser == null){return ServerResponse.createByErrorMessage("用戶未登錄");}user.setId(currentUser.getId());user.setUsername(currentUser.getUsername());ServerResponse<User> response = iUserService.updateInformation(user);if(response.isSuccess()){response.getData().setUsername(currentUser.getUsername());RedisShardedPoolUtil.setEx(loginToken, JsonUtil.obj2String(response.getData()),Const.RedisCacheExtime.REDIS_SESSION_EXTIME);}return response;}@RequestMapping(value = "get_information.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> get_information(HttpServletRequest httpServletRequest){String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User currentUser = JsonUtil.string2Obj(userJsonStr,User.class);if(currentUser == null){return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),"未登錄,需要強制登錄status=10");}return iUserService.getInformation(currentUser.getId());}
}
?
總結
以上是生活随笔為你收集整理的用户Session相关模块重构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单点登录之SessionExpireFi
- 下一篇: 分布式锁编写及调试分析