java - 在多个服务器上使用 Spring Security 和 Spring Redis Session

标签 java spring session spring-security spring-session

我有一个 Spring 项目,并且刚刚添加了带有 Redis 数据存储的 Spring session 来保存 session 对象。它已经使用了安全性来实现页面权限等。导入已更新为使用 spring 4.1.6。和安全 4.0.1。

它当前使用基于 xml 的配置。我已经设置了 Spring session 过滤器位于 Spring 安全过滤器之前

<!-- Spring session filters -->
<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>

<!-- security filters -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

一进入登录页面,就会出现一个 cookie,正如预期的那样。一个新的“ session ”cookie,与 redis 中的 cookie 相关。然而,登录后,会创建原始的 JSESSIONID cookie,这不会保留在 redis 数据库中。这个cookie是必需的,就好像我将其设置为“无状态”那么系统无法登录。

这意味着在 UI 的多个实例上,服务器之间将存在不同的安全 session ,从而使 Redis 数据存储变得冗余。

我目前不确定是否需要 JSESSIONID,因为登录时大多数字段都放置在 SESSION 中。当检索用户等时,会使用正确的 SESSION cookie,并且使用相同的 cookie 来保存信息。除了出于安全原因之外,有人能够解释其必要性吗?

有没有办法将 JSESSIONID 保留在数据库中,或者将信息保存在普通 SESSION cookie 中的安全 session 中。

最佳答案

问题是在添加 Spring session 过滤器之前设置了请求上下文。解决方案是在设置 requestContext 时显式设置,因此是在 spring session 之后。

<!-- Spring session filters -->
<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>

<!-- Request context filter - has to be after session so replaces the jsessionid with correct session -->
<filter>
    <filter-name>requestContextFilter</filter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>requestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这需要添加到WEB-INF的web.xml中

关于java - 在多个服务器上使用 Spring Security 和 Spring Redis Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873563/

相关文章:

java - intellij 错误地说没有为 Autowiring 的存储库找到类型的 bean

session - Symfony2 中并发的前端和后端 session

当我删除互联网 cookies/历史记录时,php 下拉 session 被删除

java - 在 Android 上使用 MySQL

java - 在ANTLR4中处理自定义异常

java - Spring-Social/Twitter——ConnectController 不响应/连接?

PHP SESSION 仅在子文件夹中可用

java - log4j包的导入错误

java - Localhost - 连接重置错误

oracle - 是否有充分的理由不让您的应用程序处理任何交易?