HttpSession持久化/集群共享实现

编程教程 > Java (2535) 2025-01-27 09:58:22

一.Java web中什么是HttpSession

javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中

二.HttpSession由谁创建

    session在访问tomcat服务器HttpServletRequest的getSession(true)/getSession()的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;,session默认存储在服务器的内存中。
    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。tomcat生成的sessionid叫做jsessionid。

三.HttpSession什么时候销毁

  • 超时;
  • 程序调用HttpSession.invalidate();
  • 程序关闭;

四.HttpSession持久化问题

    所有支持Servlet规范的容器都自带session管理,于是大多数人都使用HttpSession接口存放状态信息。事实上, servlet的session会使得应用服务器水平扩展变的非常困难,在应用编写时应该完全弃用HttpSession原生接口。

session在web应用中主要有以下几个功能实现:

  • session ID生成
  • session过期管理
  • session更新

4.1redis替代HttpSession接口方案设计

生成session id:
当用户登陆时,服务器生成一个全局唯一的字符串SESSION:日期:20位随机字符串做为redis中hash数据结构的key名,然后将该标识做为cookie返回给客户端。 之后该用户的后续请求都会带上此cookie, 我们编写一个filter, 其作用为读取请求中的标识,从redis中取出该标识对应的数据,然后放到HttpServletRequest对象中以供后续使用。

session过期:
使用redis自带的过期功能为session id设置过期时间,轻松实现session过期。

session追踪:
我们可以将每个用户的session id记录下来,如保存到数据库中,或者依然放在redis里,这样就可以查到某个注册用户所有session id, 轻松实现踢出登陆功能。

session更新:
通过AOP, 在每个请求完后之后,检查在请求处理过程中有没有更新session信息,如果有则将新数据刷新到Redis中。

方案特点:
将session转移到redis中后,只要做好redis的运维工作,我们的应用服务器已经是完全无状态的了,水平扩展时只需要添加机器而不需要改动任何一行代码。

4.2 spring session成熟方案替换HttpSession

spring session介绍:
Spring session为管理用户的会话信息提供了一个API和实现。它还提供了无缝的集成:

  • HttpSession——允许在应用程序容器中替换HttpSession(即Tomcat)中立的方式。附加功能,包括
  • 集群会话——Spring session使得支持集群会话而不被绑定到应用程序容器的特定解决方案变得微不足道。
  • 多个浏览器会话——Spring session支持在一个浏览器实例中管理多个用户会话(也就是说,多个经过身份验证的帐户类似于谷歌)。
  • RESTful api——Spring session允许在头文件中提供与RESTful api一起工作的会话id

WebSocket——提供在接收WebSocket消息时保持HttpSession存活的能力

spring session主要得实现方式有:

  • Redis实现(逻辑同4.1)
  • JDBC实现
  • Mongo实现
  • Hazelcast实现
  • Pivotal GemFire实现


 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
一.Java web中什么是HttpSessionjavax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数
spring boot 入门之spring session实现restful apis。通过spring boot或者spring mvc整合spring session的方式来实现sessio...
Redis 禁用持久化配置
集群总揽1) 双机集群图说明2) 配置说明修改storage A的配置文件,添加两个tracker的指向和组(group)信息说明:tracker的ip和端口根
现在zookeeper在分布式上的流行程度不亚于spring在Java中的地位。本文主要讲解zookeeper的入门,即:安装zookeeper以及配置zookeeper集群
spring boot 入门之整合spring session实现session共享。一直以来Java编程中web项目中的session共享问题都是一个很难解决的问题。接下来将讲解通过sprin...
centos7 redis安装配置以及集群
​Java序列化的作用Java序列化允许将Java对象写入文件系统以进行永久存储,也可以将其写入网络以传输到其他应用程序
前言Vert.x 中实现全局数据共享,如环境参数等。Vertx数据共享实现共享数据存入/更新SharedData sharedData = vertx.shar
Java 9 模块化编程
Apache Shiro教程,您的第一个Apache Shiro应用程序(翻译)-编程技术
步骤① 创建nacos的数据库首先,MySQL创建一个nacos专用的数据库,暂且命名为 nacos吧,如下:导入nacos的初始化SQL,一般该文件存放于 nacos/conf/nacos-m...
FLUSHALL FLUSHDB 命令会清空数据,而且从不失败,对于线上集群非常危险。KEYS * 命令,当数据规模较大时使用,会严重影响Redis性能,也非常危险。如果从根本上规避这些风险呢?...
redis 命令查看使用情况redis info命令详解,redis查看内存使用情况。redis info命令的详细解释
创建maven项目添加依赖方便开发,添加一些开发工具依赖,比如 lombok Swing UI开发创建Hello UI在src/main/java/包名下有件菜