spring - 为什么我的 session 还活着

标签 spring spring-security redis

我正在使用带有 redis 支持 session 的 spring。 如果我访问该站点,我会看到 session 已添加到数据库中。 然后我在数据库上运行 flushdb。 然后我尝试访问该站点, session 仍然存在(我有相同的 session ID。)redis key 不同,但 session ID 相同。 session 是否存储在其他地方而不是在 redis 中?这是预期的吗?

使用 windows 64 位 redis 2.8.2400。

一些 pom 依赖项。

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.6.2.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>1.0.2.RELEASE</version>
    </dependency>


    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.0.3.RELEASE</version>
    </dependency>
 <!--  -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.0.3.RELEASE</version>
    </dependency>

相关 Bean

<beans:bean id="RedisHttpSessionConfiguration" 
    class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
<beans:bean
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
    p:port="6379" />

一些 web.xml

<listener>
        <listener-class>com.mysite.listeners.sessionStarted</listener-class>
    </listener>

<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>

关闭 session 的 Controller 函数

RequestMapping(value = "/closeSession", method = RequestMethod.GET)
    public String closeSession(HttpSession session, HttpServletRequest request) {
        logger.info("Closeing Session (greri002 for testing).");
        session.invalidate();
        //request.logout();
        SecurityContextHolder.getContext().setAuthentication(null);
        return "OK";
    }

最佳答案

Spring Security 正在管理将数据存储在 Redis 中的 session 。如果您计划能够在节点之间共享 session 数据,则只需要引入像 redis 这样的东西。

存储安全信息的 Spring 的 SecurityContext。 https://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/context/SecurityContext.html

假设您正在使用支持 3.0 Servlet 的服务器,您只需在 HttpServletRequest 对象上调用 logout()。一个 spring MVC 示例 -

@RequestMapping(value="/me/logout", method=RequestMethod.GET)
public @ResponseBody String logout(HttpServletRequest request) throws ServletException {
    request.logout();
    return "OK";
}

http://docs.spring.io/spring-security/site/docs/3.2.1.CI-SNAPSHOT/reference/htmlsingle/#servletapi-logout

如果您没有访问 HttpServletRequest 的权限,您可以这样做

SecurityContextHolder.getContext().setAuthentication(null);

还要确保您已正确注销 http 配置。他是我的

    <sec:logout logout-url="/logout"
                delete-cookies="JSESSIONID,jsessionid"
                invalidate-session="true"
                success-handler-ref="myLogoutFilter"/>

关于spring - 为什么我的 session 还活着,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070501/

相关文章:

java - 文件路径给出 NullPointer

java - 如何手动处理Spring 4事务?

lua - 使用 Lua 脚本的 Redis 分布式事务

php - 具有 LRU 过期的内存缓存

java - 在 Spring MVC 中更改过滤器类中的语言环境

java - Jersey :找不到媒体类型 = 应用程序/json、类型 = 类 org.codehaus.jackson.node.ObjectNode 的 MessageBodyWriter?

spring-security - Spring security webflux 中的 AuthenticationManger

Azure AD 无法与 spring-boot webflux 配合使用

java - 无法将 DaoAuthenticationConfigurer 应用于已构建的对象

optimization - 您可以在一个 Redis 实例中插入多少条记录?