Spring mvc 分步式session的实例详解
spring mvc 分步式session的实例详解
session代表服务器与浏览器的一次会话过程,它的信息是保存在服务器端的。在servlet中,session指的是httpsession类的对象。服务器在创建session后,会把sessionid以cookie的形式回写给客户端。只要客户端的浏览器不关,每一次访问服务器都会带上这个sessionid。这样就可以在每次请求的时候获取到session的信息。
下面以spring mvc以例来说明如果创建分步式session.
1、login – 登录页
login表示用户跳转到登录页面,这个时候可以生成唯一key为sessionid的sesssionid。保存sessionid到response中,当用户真正登录的时候获取sessionid,因为是分步式所以统一的管理sessionid,把它保存在redis缓存中。
public class logincontroller{ private static final string session_id_cookie = "sessionid"; @autowired private redisclient client; @requestmapping(value="/login/index") public modelandview login(httpservletrequest request, httpservletresponse response){ modelandview modelandview = new modelandview("/login"); string sessionid = cookieutils.getcookievalue(request, session_id_cookie); if(stringutils.isemptyornull(sessionid)) { sessionid = getuniquesessionid(); addcookie(response, session_id_cookie, sessionid); } // 其它业务相关信息 return modelandview; } // 添加cookie到response private void addcookie(httpservletresponse response, string cookiename, string cookievalue) { cookie cookie = new cookie(cookiename, cookievalue); cookie.setpath("/"); cookie.setmaxage(-1); response.addcookie(cookie); } // 获取唯一sessionid private string getuniquesessionid() { string sessionid = ""; while(true) { string uuid = uuid.randomuuid().tostring(); string[] jsessionidarray = uuid.split("-"); stringbuilder jsessionidbuilder = new stringbuilder(); for(string str: jsessionidarray) { jsessionidbuilder.append(str); } sessionid = jsessionidbuilder.tostring(); if(!redisclient.exists(sessionid)) { break; } } return sessionid; } }
2、authenticate – 身份认证/登录
用户输入用户名密码,需要在后台进行登录。此时可以从cookie中获取到sessionid,然后再从redis里面获取到它的值sessionidvalue。并且把需要保存的session信息以sessionidvalue为key,保存在redis里面。
public class logincontroller{ private static final string session_id_cookie = "sessionid"; private static final integer redis_session_time_seconds = 2 * 60 * 60; @autowired private redisclient client; @requestmapping(value="/authenticate") @responsebody public responseinfo login(string username, string password, httpservletrequest request){ responseinfo<object> responseinfo = new responseinfo<object>(); try { account account = authenticate(username, password); savesession(account); responseinfo.setstatus(0); responseinfo.setmessage("success"); } catch(exceptioin e){ responseinfo.setstatus(1); responseinfo.setmessage("服务器正忙,请稍候重试") } return responseinfo; } // 保存session信息 private void savesession(account account) { string sessionid = cookieutils.getcookievalue(request, session_id_cookie); redisclient.set(sessionid, account); redisclient.expire(sessionid, redis_session_time_seconds); } }
3、logout – 登出
当用户选择退出系统时,需要把页面跳转到登录页面也就是第一步并且需要删除在redis里面的session信息以及在cookie里面的sessionid.
public class logincontroller{ private static final string session_id_cookie = "sessionid"; @autowired private redisclient client; @requestmapping(value="/logout", method = requestmethod.get) public void logout(httpservletrequest request, httpservletresponse response) { // 获取到重定向位置也就是登录页 string redirecturl = this.getloginpageredirecturl(request); clearsession(request); clearsessioncookie(request, response); response.sendredirect(redirecturl); } // 删除session在redis里面的信息 private void clearsession(httpservletrequest request) { string sessionid = cookieutils.getcookievalue(request, session_id_cookie); redisclient.del(sessionid); } // 删除session在cookie中的sessionid private void clearsessioncookie(httpservletrequest request, httpservletresponse response) { cookie sessioncookie = cookieutils.getcookie(request, session_id_cookie); sessioncookie.setmaxage(0); response.addcookie(sessioncookie); } }
4、获取session
可以把获取session提取到公共的controller中,这样需要使用session信息的类就可以继承这个类。
public class basecontroller{ @autowired private redisclient redisclient; protected account getaccountfromsession(httpservletrequest request) { string sessioncookievalue = cookieutils.getcookievalue(request, "sessionid"); if(stringutils.isemptyornull(sessioncookievalue)) { return null; } else { string accountjson = this.redisclient.get(sessioncookievalue); account account = null; if(!stringutils.isempty(accountjson)) { account = (account)json.parseobject(casinfojson, account.class); } return account; } } }
5、总结
使用第三方管理session时的基本步骤如下。
- 进入登录页面保存sessionid到cookie中
- 用户登录成功根据sessionid的值把session保存在redis里面
- 用户登出系统需要清除cookie中的sessionid,以及redis里面用户的session信息。
当用户登录成功之后进行其它操作就可以在request里面获取到用户的session信息。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: 鸡怎么炖最好吃,这样做好吃又简单