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信息。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!