2014-01-28 54 views
0

我刚刚在我的spring mvc webapp中按照http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/实现了SessionCounterListener。春季安全会议不像预期的那样

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

问题1: 当我在服务器重新启动后第一次登录login.jsp时,即使在登录之前会话计数器值为1(不是预期的)。

例如,当我去到登录页面... sessionCreated - 添加一个会话到计数器:1

,然后当我去打注销按钮会话计数减一(其中是好的),但会议计数后立即增加1(不是预期的)。

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

这是因为如果每次我去到登录页面计数增加1.我认为只有成功登录后才会增加计数。

有人能帮我理解这里发生了什么吗?

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

再次,我需要帮助理解请。

这里是我的春天的安全设置....

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

回答

1

你可能正在考虑在不同的上下文中的会话。

看看在萤火JSESSION饼干,而在你的应用程序点击,也许它会给你一些答案:)

HttpSessionListener可能被调用每次JSESSIONID变化,因此:

  1. 你得到到login.jsp页面 - 会话被创建,JSESSIONID改变,sessionCreated被调用。你登出:sessionDestroyed被调用,会话无效(这里不确定,只是猜测),计数器减少。但登录后会发生什么?您可能重定向到/logout.htm并创建新会话。
+0

谢谢你回到我身边。你所说的很多话对我来说都是有意义的。你说的注销后重定向是正确的。我在想,上面教程中提到的过滤器并不是我所追求的。事实上,我甚至不确定这可能是有用的。 – Richie