欢迎转至站内查看原文,链接为:https://www.chendd.cn/information/viewInformation/experienceShare/307.a
在此之前,也许是对于spring一些子项目的理解不够,也许是无应用场景,一直对这种子项目不感兴趣,反而认为这些东西所解决的问题肯定都是可以通过自己编码去实现的,为什么还要去使用它们呢?
还有一个问题,以前所有接触的项目中都是以JSP为主导的视图显示,对于HTML页面的session会话管理也只是采用过Token的模式去维持的,所以当开启一个新项目时,涉及到用户相关信息的时候我就不禁有此疑问了,问了一下,领导给的说法是采用spring session去管理,这不为了去理解这个东西,就有了本篇章的分享了。
使用官网的一句话来概括一下Spring Session:是一个用于管理用户会话信息的API和实现,使得支持集群会话变得微不足道,而不依赖于特定于应用程序容器的解决方案。使用它来管理用户会话信息,与传统的HttpSession不同的是它可以存储的在数据库中、Redis、内存中等,支持分布式集群环境中的用户会话应用,而传统的则将存放为所在服务器的内存中,不过也可以通过一些负载均衡的实现去维护Session的复制与绑定。Spring Session的实现方式有Spring Session JDBC、Spring Session Redis、Spring Session Hazelcast等等。
本篇文章主要围绕使用Spring xml配置(纯注解的形式不便于上手、Spring Boot的方式待后期集成实践)的方式实现Spring Session JDBC的实现,它的实现是将所有的用户会话信息存储至数据库表中,表的数据包含有Session ID、创建时间、过期时间以及存储至session中的数据对象信息。在开始之前,请务必对于官网的一些介绍有一定的理解,本文将以实践为主,这些地址分别是:
https://spring.io/projects/spring-session#samples
https://docs.spring.io/spring-session/docs/2.1.5.RELEASE/reference/html5/#httpsession-jdbc
https://github.com/spring-projects/spring-session/tree/2.1.5.RELEASE
参见官网的Spring xml版本配置说明可以能有个大概的认知,再结合GitHub上的源码就出来了一个最简单的示例,相关文件为Maven依赖、Web.xml配置、Spring-context配置、Servlet、JSP(或HTML)文件,摘几处代码重点介绍一下,后文附上源码下载:
(一) Maven依赖
主要依赖spring-session-jdbc、spring-web、mysql这三个,其中com.h2database是一个在线查询数据库的实现(非必须),servlet-api与jstl是WEB开发与JSP标签库相关的,完整的参考信息如下:
<dependency>
<groupId>org.springframework.sessiongroupId>
<artifactId>spring-session-jdbcartifactId>
<version>2.0.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>5.0.4.RELEASEversion>
dependency>
<dependency>
<groupId>com.h2databasegroupId>
<artifactId>h2artifactId>
<version>1.4.199version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.30version>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
(二) session.xml(Spring上下文)
<context:annotation-config/>
<beanclass="org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration">
<property name="tableName" value="spring_session" />
<property name="maxInactiveIntervalInSeconds" value="60" />
bean>
其中tableName与maxInactiveIntervalInSeconds都可以省略,采用默认值即可,后者默认为1800秒。
(三) 建表语句
从spring-session的GitHub地址中下载(https://github.com/spring-projects/spring-session/tree/2.1.5.RELEASE/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc)本文选取MySQL数据库的实现,所以对应的文件为“schema-mysql.sql”
(四) 示例效果
为了验证部署的多个项目中的同一个session key可实现共享,特地在同一个浏览器窗口中打开两个浏览器页面tab来模拟使用WEB中间件的页面跳转,经过验证发现在同一个浏览器的会话中,无论访问的是端口8080还是8888,它们获取到的session中的数据均保持一致,参考下图所示:
8888服务器HTML页面:
8080服务器HTML页面:
8888服务器JSP与8080服务器JSP:
h2登录控制台:
h2控制台
(1)本文介绍了Spring Session JDBC的XML实现案例,并附有两个最常见的参数设置;
(2)本文展示了在部署多应用时的session共享(复制)方案;
(3)介绍了h2的在线数据库控制台;
(4)尝试着使用JDBC方式集成的Session Listener均未生效,貌似是此种方式不支持,如果需要Session监听器我认为可以通过其它方式的集成实现或者使用查询数据库的方式实现,JDBC不支持Session监听器的参考描述(或许是的)如下:
(5)Spring Session JDBC不支持HttpSessionListener,其实如果想要监听session的创建与销毁自行查询数据库便可很方便的进行统计;
https://gitee.com/88911006/chendd-examples