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时的基本步骤如下。
当用户登录成功之后进行其它操作就可以在request里面获取到用户的session信息。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Spring
# mvc
# 分步式session的使用方法
# 分步式session的详解
# 详解Spring mvc ant path的使用方法
# Spring MVC全局异常处理和单元测试_动力节点Java学院整理
# Spring MVC入门_动力节点Java学院整理
# Spring MVC之DispatcherServlet_动力节点Java学院整理
# Spring MVC之WebApplicationContext_动力节点Java学院整理
# Spring MVC访问静态文件_动力节点Java学院整理
# spring mvc常用注解_动力节点Java学院整理
# springMVC图片上传的处理方式详解
# 就可以
# 用户登录
# 跳转到
# 客户端
# 如有
# 把它
# 希望能
# 相关信息
# 然后再
# 这个时候
# 会把
# 谢谢大家
# 第三方
# 输入用户名
# 指的是
# 请稍候
# 不关
# 重试
# 重定向
# 身份认证
相关文章:
,如何利用word制作宣传手册?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
小建面朝正北,A点实际方位是否存在偏差?
已有域名和空间如何搭建网站?
如何注册花生壳免费域名并搭建个人网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
浅析上传头像示例及其注意事项
TestNG的testng.xml配置文件怎么写
建站主机助手选型指南:2025年热门推荐与高效部署技巧
设计网站制作公司有哪些,制作网页教程?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
制作公司内部网站有哪些,内网如何建网站?
网站制作壁纸教程视频,电脑壁纸网站?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
建站主机选购指南:核心配置与性价比推荐解析
python的本地网站制作,如何创建本地站点?
潮流网站制作头像软件下载,适合母子的网名有哪些?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
建站之星后台密码遗忘如何找回?
个人网站制作流程图片大全,个人网站如何注销?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
建站之星后台管理如何实现高效配置?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何用AWS免费套餐快速搭建高效网站?
定制建站是什么?如何实现个性化需求?
名字制作网站免费,所有小说网站的名字?
如何打造高效商业网站?建站目的决定转化率
如何选择美橙互联多站合一建站方案?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
建设网站制作价格,怎样建立自己的公司网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何安全更换建站之星模板并保留数据?
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何快速生成凡客建站的专业级图册?
如何用花生壳三步快速搭建专属网站?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何在云主机快速搭建网站站点?
招商网站制作流程,网站招商广告语?
如何快速生成橙子建站落地页链接?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
网站制作企业,网站的banner和导航栏是指什么?
制作表格网站有哪些,线上表格怎么弄?
如何自定义建站之星网站的导航菜单样式?
如何在IIS中配置站点IP、端口及主机头?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何高效配置香港服务器实现快速建站?
如何通过宝塔面板实现本地网站访问?
建站之星如何助力企业快速打造五合一网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。