Spring mvc 分步式session的实例详解

发布时间 - 2026-01-11 03:03:09    点击率:

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信息。

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# 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图片上传的处理方式详解  # 就可以  # 用户登录  # 跳转到  # 客户端  # 如有  # 把它  # 希望能  # 相关信息  # 然后再  # 这个时候  # 会把  # 谢谢大家  # 第三方  # 输入用户名  # 指的是  # 请稍候  # 不关  # 重试  # 重定向  # 身份认证 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何发送系统通知?(Notification渠道示例)  如何在 Pandas 中基于一列条件计算另一列的分组均值  *服务器网站为何频现安全漏洞?  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何用AWS免费套餐快速搭建高效网站?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何用好域名打造高点击率的自主建站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何获取免费开源的自助建站系统源码?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  微信推文制作网站有哪些,怎么做微信推文,急?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在IIS中新建站点并配置端口与物理路径?  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  如何在VPS电脑上快速搭建网站?  简历没回改:利用AI润色让你的文字更专业  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Android Socket接口实现即时通讯实例代码  Laravel如何升级到最新版本?(升级指南和步骤)  详解Android图表 MPAndroidChart折线图  在线教育网站制作平台,山西立德教育官网?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么清理缓存_Laravel optimize clear命令详解  香港网站服务器数量如何影响SEO优化效果?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  在centOS 7安装mysql 5.7的详细教程  如何在万网ECS上快速搭建专属网站?  微信小程序 HTTPS报错整理常见问题及解决方案  如何在景安服务器上快速搭建个人网站?  高端云建站费用究竟需要多少预算?  javascript基于原型链的继承及call和apply函数用法分析  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  香港服务器如何优化才能显著提升网站加载速度?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议