Spring mvc 分步式session的实例详解
Springmvc分步式session的实例详解
Session代表服务器与浏览器的一次会话过程,它的信息是保存在服务器端的。在Servlet中,session指的是HttpSession类的对象。服务器在创建session后,会把sessionid以cookie的形式回写给客户端。只要客户端的浏览器不关,每一次访问服务器都会带上这个sessionid。这样就可以在每次请求的时候获取到session的信息。
下面以springMVC以例来说明如果创建分步式session.
1、login–登录页
login表示用户跳转到登录页面,这个时候可以生成唯一key为sessionid的sesssionid。保存sessionid到response中,当用户真正登录的时候获取sessionid,因为是分步式所以统一的管理sessionid,把它保存在Redis缓存中。
publicclassLoginController{
privatestaticfinalStringSESSION_ID_COOKIE="sessionId";
@Autowired
privateRedisClientclient;
@RequestMapping(value="/login/index")
publicModelAndViewlogin(HttpServletRequestrequest,HttpServletResponseresponse){
ModelAndViewmodelAndView=newModelAndView("/login");
StringsessionId=CookieUtils.getCookieValue(request,SESSION_ID_COOKIE);
if(StringUtils.isEmptyOrNull(sessionId)){
sessionId=getUniqueSessionId();
addCookie(response,SESSION_ID_COOKIE,sessionId);
}
//其它业务相关信息
returnmodelAndView;
}
//添加cookie到response
privatevoidaddCookie(HttpServletResponseresponse,StringcookieName,StringcookieValue){
Cookiecookie=newCookie(cookieName,cookieValue);
cookie.setPath("/");
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
//获取唯一sessionid
privateStringgetUniqueSessionId(){
StringsessionId="";
while(true){
Stringuuid=UUID.randomUUID().toString();
String[]jsessionIdArray=uuid.split("-");
StringBuilderjsessionIdBuilder=newStringBuilder();
for(Stringstr:jsessionIdArray){
jsessionIdBuilder.append(str);
}
sessionId=jsessionIdBuilder.toString();
if(!redisClient.exists(sessionId)){
break;
}
}
returnsessionId;
}
}
2、authenticate–身份认证/登录
用户输入用户名密码,需要在后台进行登录。此时可以从cookie中获取到sessionid,然后再从redis里面获取到它的值sessionidvalue。并且把需要保存的session信息以sessionidvalue为key,保存在redis里面。
publicclassLoginController{
privatestaticfinalStringSESSION_ID_COOKIE="sessionId";
privatestaticfinalIntegerREDIS_SESSION_TIME_SECONDS=2*60*60;
@Autowired
privateRedisClientclient;
@RequestMapping(value="/authenticate")
@ResponseBody
publicResponseInfologin(Stringusername,Stringpassword,HttpServletRequestrequest){
ResponseInfo
3、logout–登出
当用户选择退出系统时,需要把页面跳转到登录页面也就是第一步并且需要删除在redis里面的session信息以及在Cookie里面的sessionid.
publicclassLoginController{
privatestaticfinalStringSESSION_ID_COOKIE="sessionId";
@Autowired
privateRedisClientclient;
@RequestMapping(value="/logout",method=RequestMethod.GET)
publicvoidlogout(HttpServletRequestrequest,HttpServletResponseresponse){
//获取到重定向位置也就是登录页
StringredirectUrl=this.getLoginPageRedirectUrl(request);
clearSession(request);
clearSessionCookie(request,response);
response.sendRedirect(redirectUrl);
}
//删除session在redis里面的信息
privatevoidclearSession(HttpServletRequestrequest){
StringsessionId=CookieUtils.getCookieValue(request,SESSION_ID_COOKIE);
redisClient.del(sessionId);
}
//删除session在cookie中的sessionid
privatevoidclearSessionCookie(HttpServletRequestrequest,HttpServletResponseresponse){
CookiesessionCookie=CookieUtils.getCookie(request,SESSION_ID_COOKIE);
sessionCookie.setMaxAge(0);
response.addCookie(sessionCookie);
}
}
4、获取session
可以把获取session提取到公共的Controller中,这样需要使用session信息的类就可以继承这个类。
publicclassBaseController{
@Autowired
privateRedisClientredisClient;
protectedAccountgetAccountFromSession(HttpServletRequestrequest){
StringsessionCookieValue=CookieUtils.getCookieValue(request,"sessionid");
if(StringUtils.isEmptyOrNull(sessionCookieValue)){
returnnull;
}else{
StringaccountJson=this.redisClient.get(sessionCookieValue);
Accountaccount=null;
if(!StringUtils.isEmpty(accountJson)){
account=(Account)JSON.parseObject(casInfoJson,Account.class);
}
returnaccount;
}
}
}
5、总结
使用第三方管理session时的基本步骤如下。
- 进入登录页面保存sessionid到cookie中
- 用户登录成功根据sessionid的值把Session保存在redis里面
- 用户登出系统需要清除cookie中的sessionid,以及redis里面用户的session信息。
当用户登录成功之后进行其它操作就可以在request里面获取到用户的session信息。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!