千家信息网

基于Spring-Session如何实现会话共享

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,今天就跟大家聊聊有关基于Spring-Session如何实现会话共享,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前段时间,在对项目权限框架调
千家信息网最后更新 2025年01月31日基于Spring-Session如何实现会话共享

今天就跟大家聊聊有关基于Spring-Session如何实现会话共享,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

前段时间,在对项目权限框架调整的时候(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配置如下:

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

2、属性文件config.properties配置如下:

## redis pool configredis.pool.maxTotal=100redis.pool.maxIdle=20redis.pool.minIdle=10redis.pool.blockWhenExhausted=trueredis.pool.maxWaitMillis=3000redis.pool.testOnBorrow=falseredis.pool.testOnReturn=falseredis.pool.testWhileIdle=trueredis.pool.minEvictableIdleTimeMillis=60000redis.pool.timeBetweenEvictionRunsMillis=30000redis.pool.numTestsPerEvictionRun=-1# redis configredis.host=192.168.0.123redis.port=6379redis.password=admin-123456redis.database=0redis.timeout=3600

3、web.xml配置如下:

        editor                        contextConfigLocation                classpath:spring/applicationContext.xml,classpath:spring/applicationContext-security.xml                                  org.jasig.cas.client.session.SingleSignOutHttpSessionListener                                  org.springframework.web.context.ContextLoaderListener                                org.springframework.web.util.IntrospectorCleanupListener                                org.springframework.web.context.request.RequestContextListener                                                CAS Single Sign Out Filter                com.wuzb.pw.common.shiro.CustomSingleSignOutFilter                                CAS Single Sign Out Filter                /*                                                CharacterEncodingFilter                org.springframework.web.filter.CharacterEncodingFilter                                        encoding                        utf-8                                                        forceEncoding                        true                                                CharacterEncodingFilter                /*                                        shiroFilter                org.springframework.web.filter.DelegatingFilterProxy                true                                        targetFilterLifecycle                        true                                                shiroFilter                /*                                        springSessionRepositoryFilter                org.springframework.web.filter.DelegatingFilterProxy                                springSessionRepositoryFilter                /*                                 dispatcherServlet                org.springframework.web.servlet.DispatcherServlet                                        contextConfigLocation                        classpath:spring/applicationContext-mvc.xml                                                dispatcherServlet                /                                                        

项目中使用的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.(Ljava/lang/ClassLoader;)V        at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.(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如何实现会话共享有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0