共計 6424 個字符,預計需要花費 17 分鐘才能閱讀完成。
今天就跟大家聊聊有關基于 Spring-Session 如何實現會話共享,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
前段時間,在對項目權限框架調整的時候(SpringSecurity 改成 Shiro),集成了 SpringSession 小插件。
由于現今本項目某些特性,暫時無法進行分布式部署,所以對 SpringSession 并沒有進行深入測試以及生產上部署應用,這里只是記錄整合的過程以及一些心得。
網上也看到一些同學說 SpringSession 存在一些坑,比如無法實現跨域 Session 共享,然后通過修改其 Cookie 生產策略可以進行解決等,因此在生產使用之前,還需進行充分的測試。
學習 @Configuration、@Bean 兩個 Spring 注解:
Spring 中為了減少 xml 中配置,引入了 @Configuration 和 @Bean 注解類。@Configuration 注解的類,等價于 XML 中配置 beans,表明這個類是 beans 定義的源;@Bean 注解的方法等價于 XML 中配置的 bean,該方法創建出的實例由 Ioc 容器管理。
SpringSession 核心的配置類為 SpringHttpSessionConfiguration(框架也默認提供了 Redis、Mongo、Jdbc 等實現,本項目使用 RedisHttpSessionConfiguration)。RedisHttpSessionConfiguration 類中最重要的兩個操作就是創建 springSessionRepositoryFilter 以及 sessionRedisTemplate。在創建 sessionRedisTemplate 時框架會依賴解析 RedisConnectionFactory,所以在 Spring 配置中我們需要定義 RedisConnectionFactory;springSessionRepositoryFilter 是 SpringSession 的核心,也是 web.xml 中 Filter 代理,整個 Session 的獲取以及提交都在其里實現。
以下是整個配置的過程:
1、applicationContext-session.xml 配置如下:
?xml version= 1.0 encoding= UTF-8 ?
beans xmlns= http://www.springframework.org/schema/beans
xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance
xmlns:mvc= http://www.springframework.org/schema/mvc
xmlns:context= http://www.springframework.org/schema/context
xmlns:util= http://www.springframework.org/schema/util
xmlns:aop= http://www.springframework.org/schema/aop
xmlns:tx= http://www.springframework.org/schema/tx
xsi:schemaLocation= http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd default-lazy-init= true
bean id= jedisPoolConfig >2、屬性文件 config.properties 配置如下:
## redis pool config
redis.pool.maxTotal=100
redis.pool.maxIdle=20
redis.pool.minIdle=10
redis.pool.blockWhenExhausted=true
redis.pool.maxWaitMillis=3000
redis.pool.testOnBorrow=false
redis.pool.testOnReturn=false
redis.pool.testWhileIdle=true
redis.pool.minEvictableIdleTimeMillis=60000
redis.pool.timeBetweenEvictionRunsMillis=30000
redis.pool.numTestsPerEvictionRun=-1
# redis config
redis.host=192.168.0.123
redis.port=6379
redis.password=admin-123456
redis.database=0
redis.timeout=3600
3、web.xml 配置如下:
?xml version= 1.0 encoding= UTF-8 ?
web-app xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance
xmlns= http://java.sun.com/xml/ns/javaee
xsi:schemaLocation= http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
id= WebApp_ID version= 2.5
display-name editor /display-name
context-param
param-name contextConfigLocation /param-name
param-value classpath:spring/applicationContext.xml,classpath:spring/applicationContext-security.xml /param-value
/context-param
listener
listener-class org.jasig.cas.client.session.SingleSignOutHttpSessionListener /listener-class
/listener
listener
listener-class org.springframework.web.context.ContextLoaderListener /listener-class
/listener
listener
listener-class org.springframework.web.util.IntrospectorCleanupListener /listener-class
/listener
listener
listener-class org.springframework.web.context.request.RequestContextListener /listener-class
/listener
!-- CAS 單點退出 --
filter
filter-name CAS Single Sign Out Filter /filter-name
filter-class com.wuzb.pw.common.shiro.CustomSingleSignOutFilter /filter-class
/filter
filter-mapping
filter-name CAS Single Sign Out Filter /filter-name
url-pattern /* /url-pattern
/filter-mapping
!-- POST 亂碼處理 --
filter
filter-name CharacterEncodingFilter /filter-name
filter-class org.springframework.web.filter.CharacterEncodingFilter /filter-class
init-param
param-name encoding /param-name
param-value utf-8 /param-value
/init-param
init-param
param-name forceEncoding /param-name
param-value true /param-value
/init-param
/filter
filter-mapping
filter-name CharacterEncodingFilter /filter-name
url-pattern /* /url-pattern
/filter-mapping
filter
filter-name shiroFilter /filter-name
filter-class org.springframework.web.filter.DelegatingFilterProxy /filter-class
async-supported true /async-supported
init-param
param-name targetFilterLifecycle /param-name
param-value true /param-value
/init-param
/filter
filter-mapping
filter-name shiroFilter /filter-name
url-pattern /* /url-pattern
/filter-mapping
filter
filter-name springSessionRepositoryFilter /filter-name
filter-class org.springframework.web.filter.DelegatingFilterProxy /filter-class
/filter
filter-mapping
filter-name springSessionRepositoryFilter /filter-name
url-pattern /* /url-pattern
/filter-mapping
servlet
servlet-name dispatcherServlet /servlet-name
servlet-class org.springframework.web.servlet.DispatcherServlet /servlet-class
init-param
param-name contextConfigLocation /param-name
param-value classpath:spring/applicationContext-mvc.xml /param-value
/init-param
/servlet
servlet-mapping
servlet-name dispatcherServlet /servlet-name
url-pattern / /url-pattern
/servlet-mapping
welcome-file-list
welcome-file /welcome-file
/welcome-file-list
/web-app
項目中使用的 Spring 版本 4.1.6.RELEASE。其中集成 Spring Session 所需的 Jar 如下:
spring-data-commons-1.12.3.RELEASE.jar
spring-data-keyvalue-1.1.3.RELEASE.jar
spring-data-redis-1.7.1.RELEASE.jar
spring-session-1.2.2.RELEASE.jar
spring-session-data-redis-1.2.2.RELEASE.jar
jedis-2.8.1.jar
需要注意的點:
spring-session-data-redis-1.2.2.RELEASE.jar 默認依賴 spring-data-redis-1.7.1.RELEASE.jar,
若使用 spring-data-redis-1.7.3.RELEASE 或者更高版本的會出現如下異常:
Caused by: java.lang.NoSuchMethodError: org.springframework.core.serializer.support.DeserializingConverter. init (Ljava/lang/ClassLoader;)V
at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer. init (JdkSerializationRedisSerializer.java:53)
at org.springframework.data.redis.core.RedisTemplate.afterPropertiesSet(RedisTemplate.java:119)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
... 49 more
在處理分布式 Session 的案例中,有很多種解決方案。例如基于 Tomcat 中間件(TomcatRedisSessionManager)基于服務器基本做會話共享(局限大);基于 SpringSession 插件實現 Session 共享;若使用 Shiro 權限框架還可以自己實現 SessionDao 來實現 Session 共享。這些在后續時間里,再繼續探索。
看完上述內容,你們對基于 Spring-Session 如何實現會話共享有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。