springsession(springsession优缺点)

本篇文章给大家谈谈springsession,以及springsession优缺点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Spring全家桶之Spring Session实战教程

Spring Session 是Spring家族中的一个子项目,它提供一组API和实现,用于管理用户的session信息,它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中。

是指在一个浏览器访问多个 Web 服务时,服务端的 Session 数据需要共享。

通过对应用服务器的配置开启服务器的 Session 复制功能,在集群中的几台服务器之间同步 Session 对象,使得每台服务器上都保存所有的 Session 信息,这样任何一台宕机都不会导致 Session 的数据丢失,服务器使用 Session 时,直接从本地获取。这种方式的缺点也比较明显。因为 Session 需要时时同步,并且同步过程是有应用服务器来完成,由此对服务器的性能损耗也比较大。

利用 hash 算法,比如 nginx 的 ip_hash,使得棚悉拆同一个 Ip 的请求分发到同一台服务器上。 这种方式不符合对系统的高可用要求,因为一旦某台服务器宕机,那么该机器上的 Session 也就不复存在了,用户请求切换到其他机器后么有 Session,无法完成业务处理。

Session 记录在客户端,每次请求服务器的时候,将 Session 放在请求中发送给服务器, 服务器处理完请求后再将修改后的 Session 响应给客户端。这里的客户端就是 cookie。 利用 cookie 记录 Session 的也有缺点,比如受 cookie 大小的限制,能记录的信息有限, 安全性低,每次请求响应都需要传递 cookie,影响性能,如果用户关闭 cookie,访问就不正常。

Session 服务器可以解决上面的所有的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写陆罩 Session 时,都访问 Session 服务器链枣。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。

本课程详细讲解Spring session如何解决集群模式/分布式/跨域环境下,实现session的同步共享问题,是构建大规模应用必须要考虑的一个问题。

SpringSession视频教程

SpringSession资料下载

•001.SpringSession: Session机制

•002.SpringSession: Session机制存放过程

•003.SpringSession: 集群后丢失Session原因

•004.SpringSession: Session共享方案介绍

•005.SpringSession: SpringSession介绍

•006.SpringSession: Session丢失演示

•007.SpringSession: 集成SpringSession实现Session共享

•008.SpringSession: Redis中的Session数据存放结构

•009.SpringSession: SpringSession使用场景

•010.SpringSession: 同域名下不同项目的Session共享

•011.SpringSession: 同根据域名不同二级子域名的Session共享

•012.SpringSession: 单点登录

•013.SpringSession: P2P项目Session共享

•014.SpringSession: SpringBoot集成SpringSession

[img]

如何使用Spring Session实现分布式Session管理

Spring Session作为Spring社区官方推荐的一个比较简单快速则启的Java Web分布式session解决方案,帮我们搞定了长期以来比较蛋疼的session分布式的问题。

Spring Session解决的基本思路很简单,即将用户的session信息缓改全部存放到一个redis数据库中,所有的session都从这个数据库拿。由于redis是一个内存数据库,数据信息读写是非常快速的。如此一来,多个Tomcat,共用一个redis数据孙哪如库,即实现了session的共享问题。

访问Spring Session官方网站:

在百度中查询Spring Session即可找到Spring Session的官方站点。

目前版本为1.0.2,1.0.3版本处于snapshot状态。

Spring指出,Spring Session具有如下能力:

(1) API and implementations for managing a user's session

(2) HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way

(2-1)Clustered Sessions - Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution.

(2-2)Multiple Browser Sessions - Spring Session supports managing multiple users' sessions in a single browser instance (i.e. multiple authenticated accounts similar to Google).

(2-3)RESTful APIs - Spring Session allows providing session ids in headers to work with RESTful APIs

(3) WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages

对Spring Session有了基本了解之后,可以开始配置Maven的pom.xml,导入SpringSession的jar包

Spring官方文档指出,要使用Spring Session,配置如下依赖即可:

dependency

groupIdorg.springframework.session/groupId

artifactIdspring-session-data-redis/artifactId

version1.0.2.RELEASE/version

/dependency

实际上,spring-session-data-redis并不是一个实际的jar包,只不过它配置了其他的四个依赖:

Spring-session-data-redis是一个空的包,我们可以从如下截图中看出。Spring-session-data-redis仅仅只有一个META-INF文件夹。它的作用就在于引入其他四个包。

当然,实际上你也可以不配置spring-session-data-redis,而直接配置实际上导入的类:

!-- Redis --

dependency

groupIdorg.springframework.data/groupId

artifactIdspring-data-redis/artifactId

version1.4.2.RELEASE/version

/dependency

dependency

groupIdredis.clients/groupId

artifactIdjedis/artifactId

version2.5.2/version

/dependency

!-- Spring Session --

dependency

groupIdorg.springframework.session/groupId

artifactIdspring-session/artifactId

version1.0.2.RELEASE/version

/dependency

dependency

groupIdorg.apache.commons/groupId

artifactIdcommons-pool2/artifactId

version2.2/version

/dependency

我们这里,首先,配置spring-data-redis和jedis,这样,就可以使用spring-data-redis框架,来实现访问redis数据库。

spring-data-redis是spring的一个子项目,和spring-session一样。spring-session要访问redis,这里spring-session依赖spring-data-redis,来实现操作reids数据库。

Spring Core、Spring Web需要配置4.x版本。

当然,Spring Session还需要把Spring Web等常见的Spring包引入。Spring Session 1.0.2依赖Spring的版本为4.1.6以上,因此,3.x版本的Spring是无法使用的:

可以从Maven Repository查看依赖情况:

此外,注意javax.servlet-api需要3.0.1版本以上。

配置application-context.xml文件

这里,我们以使用xml配置方式为例,当然也可以使用注解配置,详见SPring的官方例子(见参考资料)

备注:xml的配置方法官方给出了一个例子:

在application-context.xml文件中,加入:

context:annotation-config/

bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/

bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" /

bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/

其中,${redis.host}等即redis数据库的服务器地址,端口,密码等信息,放在properties文件中即可。

修改web.xml,加入Spring Session的Filter

在web.xml文件中,加入:

filter

filter-namespringSessionRepositoryFilter/filter-name

filter-classorg.springframework.web.filter.DelegatingFilterProxy/filter-class

/filter

filter-mapping

filter-namespringSessionRepositoryFilter/filter-name

url-pattern/*/url-pattern

/filter-mapping

这样,所有的请求,都会被DelegatingFilterProxy处理,实际上,DelegatingFilterProxy会找到springSessionRepositoryFilter,创建它。每一次的请求还是由springSessionRepositoryFilter来过滤的。

The DelegatingFilterProxy will look up a Bean by the name of springSessionRepositoryFilter and cast it to a Filter. For every request that DelegatingFilterProxy is invoked, the springSessionRepositoryFilter will be invoked.

这里,Spring加入了一个Filter,其本质是:对每一个请求的request进行了一次封装。那么,在Controller里面拿出的request实际上是封装后的request,

调用request.getSession()的时候,实际上拿到是Spring封装后的session。这个session则存储在redis数据库中。

访问Web项目,查看session

访问Web项目,这个时候,使用redis-cli进入redis命令操作界面,在使用keys *可以查看所有的key:

第一个是当前访问的用户的session信息,第二个保存的是过期的时间。

可以查看session的详细内容如下:

可以看出,session对象被序列化后存入。因此,所有放入session的对象,都要实现Serializable接口。比如,我将所有的用户信息,封装到一个Authentication对象,那么

这对象就必须实现Serializable接口:

补充一下:

如果要设置Session的过期时间,通常我们会在web.xml文件中进行设置:

但是,使用Spring Session托管session后,这里的设置将会失效。我们要专门为Spring Session进行设置:

将application-context.xml,即步骤4中的的RedisHttpSessionConfiguration,设置其maxInactiveIntervalInSeconds属性即可。注意,maxInactiveIntervalInSeconds的的单位是秒! 如下将设置session为10分钟过期!

bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"

property name="maxInactiveIntervalInSeconds" value="600"/property

/bean

Spring Session中session的事件监听

Redis版本2.8

(默认spring session会自动开启该配置)

配置文件:notify-keyspace-events Ex

命令行:redis-cli config set notify-keyspace-events Egx

不需要自携腔动开启该配祥岩置的话可以将如下配置加入到容器中

在spring-Session中session的创建、删除、过期都会接收到redis相关事件的通知

spring-session中接收到相关通知后谨隐御再由Spring发布相关ApplicationEvent(SessionCreatedEvent 、SessionDeletedEvent 、SessionExpiredEvent)

由spring-context提供的@EventListener注解即可实现相关事件的监听

Spring Session官方文档

将Redis消息转换为Spring的ApplicationEvent实现类:org.springframework.session.data.redis.RedisOperationsSessionRepository

Redis键空间通知

Spring-session启动失败

Spring-session redis启动失败

关于springsession和springsession优缺点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表