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信息。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!