会话重置时,Spring security无法正常工作

会话重置时,Spring security无法正常工作,spring,spring-security,Spring,Spring Security,我重新启动服务器,从本质上清除会话的所有内容。由于会话已被清除,因此不能再认为用户已登录。(JSESSIONID cookie保留在浏览器中) 但是spring不会重定向到登录,除非我从浏览器中删除JessionidCookie。 我的问题是——为什么SpringSecurity依赖于JessionidCookie而不是会话 这是我的spring-security.xml配置- <security:global-method-security secured-ann

我重新启动服务器,从本质上清除会话的所有内容。由于会话已被清除,因此不能再认为用户已登录。(JSESSIONID cookie保留在浏览器中)

但是spring不会重定向到登录,除非我从浏览器中删除JessionidCookie。 我的问题是——为什么SpringSecurity依赖于JessionidCookie而不是会话

这是我的spring-security.xml配置-

    <security:global-method-security
        secured-annotations="enabled" />

    <security:http auto-config="true">
        <!-- Restrict URLs based on role -->
        <security:intercept-url pattern="/portal/login*"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/logoutSuccess*"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />

        <security:intercept-url pattern="/**/*.css"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:intercept-url pattern="/**/*.js"
            access="IS_AUTHENTICATED_ANONYMOUSLY" />    

        <security:intercept-url pattern="/portal/**"
            access="ROLE_USER, ROLE_ADMIN" />

        <security:form-login login-page="/portal/login.action"
            login-processing-url="/portal/loginProcess" default-target-url="/portal/index"
            authentication-failure-url="/portal/login.action?login_error=1" />

        <security:logout logout-url="/portal/logout"
            logout-success-url="/portal/login.action" />

    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>

            <security:jdbc-user-service
                data-source-ref="dataSource"
                users-by-username-query="SELECT emailid AS username, password, IF(active = 'Y', true, false) AS enabled FROM users WHERE emailid = ?"
                authorities-by-username-query="SELECT username, authority from authorities where username = ?" />
        </security:authentication-provider>
    </security:authentication-manager>

我重新启动了服务器,基本上清除了 会议结束了。由于会话已被清除,用户无法 不再被视为已登录

根据您的评论,服务器重启后,应用程序的行为就像用户登录一样,我怀疑您启用了会话持久性(在Tomcat/JBoss上默认启用),因此您实际登录了(相同的JSESSIONID)。此外,您可能会丢失会话内容,因为您放入会话中的对象是不可序列化的

根据Tomcat文档(JBoss在本例中的行为类似):

如上所述,禁用每个web应用程序的会话持久性 默认情况下,配置了标准管理器实现,并且 跨重启执行会话持久性。要禁用此功能 持久性功能,为您的web创建上下文配置文件 应用程序并在其中添加以下元素:


我的问题是-为什么spring security依赖于JESSIONID cookie和 休会

您必须已启用基于cookie的会话。如果您使用的是Tomcat7,那么web.xml中可能有类似的内容

<session-config>
  <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

曲奇

删除它。

如果您不从web浏览器中删除cookie,并且服务器不将您重定向到日志页面,会发生什么情况?它的行为是否像您登录一样(您可以看到受保护的资源等)?@Poitrek-Yes。它的行为就像用户已登录一样。
<session-config>
  <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
  <tracking-mode>COOKIE</tracking-mode>
</session-config>