【问题标题】:spring security session not behaving as expected春季安全会议未按预期运行
【发布时间】:2014-02-19 06:54:16
【问题描述】:

我刚刚按照http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/ 在我的spring mvc webapp 中实现了一个SessionCounterListener。

我看到了一些我没想到的行为,并且有两个问题。

问题 1。 当我在服务器重启后第一次点击我的 login.jsp 时,会话计数器甚至在我登录之前就加了 1(不是预期的)。

例如当我进入登录页面时... sessionCreated - 将一个会话添加到计数器:1

然后,当我点击注销按钮时,会话计数减一(这很好),但在会话计数增加 1 之后立即(不是预期的)。

例如,当我按下注销按钮时... sessionDestroyed - 从 counter:0 中扣除一个会话 sessionCreated - 将一个会话添加到计数器:1

好像每次我进入登录页面时计数都会增加1。我希望只有在成功登录后才会增加计数。

谁能帮我理解这里发生了什么?

问题 2。 当我在我的应用程序中以其他用户身份登录而第一个用户仍然登录时,我没有得到新的会话计数器。即,我认为它不会为新用户创建新会话。

再次请大家帮忙理解一下。

这是我的 spring 安全设置....

<http pattern="/login.htm" security="none"/>
<http use-expressions="true" auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">    
    <!-- custom filters -->
    <custom-filter position="FORM_LOGIN_FILTER" ref="twoFactorAuthenticationFilter" />
    <custom-filter ref="securityLoggingFilter" after="SECURITY_CONTEXT_FILTER"/>

    <!-- session management --> 
    <session-management 
        invalid-session-url="/sessionExpired.htm" 
        session-authentication-error-url="/alreadyLoggedIn.htm">

        <concurrency-control 
            max-sessions="1" 
            expired-url="/sessionExpiredDuplicateLogin.htm" 
            error-if-maximum-exceeded="false" />
    </session-management>   

    <!-- error handlers -->
    <access-denied-handler error-page="/accessDenied.htm"/>             

    <!-- logout --> 
    <logout logout-success-url="/logout.htm" invalidate-session="true" delete-cookies="JSESSIONID" />   

    <!-- authorize pages -->    
    <intercept-url pattern="/home.htm" access="isAuthenticated()" />
    <intercept-url pattern="/shortsAndOvers.htm" access="isAuthenticated()" />
    <intercept-url pattern="/shortsAndOversDaily.htm" access="isAuthenticated()" />
    <intercept-url pattern="/birtpage.htm" access="isAuthenticated()" />
    <intercept-url pattern="/reports/show.htm" access="isAuthenticated()" />    

</http>

<beans:bean id="loginUrlAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/login.htm" />
</beans:bean>

<beans:bean id="successHandler" class="com.me.reporting.security.CustomSavedRequestAwareAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/home.htm" />
</beans:bean>

<beans:bean id="failureHandler" class="com.me.reporting.security.CustomSimpleUrlAuthenticationFailureHandler">
    <beans:property name="defaultFailureUrl" value="/loginfailed.htm" />
</beans:bean>  

【问题讨论】:

    标签: spring-mvc spring-security


    【解决方案1】:

    您可能正在考虑不同背景下的会话。

    点击你的应用程序时看看firebug中的JSESSION cookie,也许它会给你一些答案:)

    可能每次 JSESSIONID 改变时都会调用 HttpSessionListener,所以:

    1. 您将进入 login.jsp 页面 - 创建会话,更改 JSESSIONID,调用 sessionCreated。您正在注销: sessionDestroyed 被调用,会话无效(这里不确定,只是猜测),计数器减少。但是登出后会发生什么?您可能被重定向到 /logout.htm 并创建了新会话。

    【讨论】:

    • 感谢您回复我。你说的很多对我来说都很有道理。您所说的注销后重定向是正确的。我认为上面教程中提到的过滤器并不是我真正想要的。事实上,我什至不知道这有什么用处。
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 2011-06-21
    • 2013-12-22
    • 2018-11-30
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多