在ajax调用中无法识别Spring Security会话超时

时间:2011-08-03 05:50:16

标签: ajax session jsf-2 spring-security session-timeout

我希望在发生会话超时时将用户重定向到登录页面。这与弹簧安全性开箱即用,但仅限于非ajax调用。

在ajax-call上你必须自己对会话超时作出反应。因此我创造了 我自己的过滤器(在this question中实现的过滤器),用于检查会话是否超时。过滤器通过spring security config中的custom-filter标记进行注册。

<http use-expressions="true">
    <custom-filter ref="customTimeoutHandler" after="LAST"/>
</http>

问题是,过滤器无法识别会话超时。如果我检查request.isRequestedSessionIdValid(),即使会话超时,它也会返回true。当我手动输入新的安全URL时,标准的spring安全过滤器会正确识别超时并重定向到登录页面。

这里有什么问题?如何识别春季安全会话超时?

更新

看起来,spring security的会话管理过滤器用一个新的匿名会话取代了超时会话。因此,每当我检查会话超时时,它都返回true,因为新的匿名会话当然不是超时的。

3 个答案:

答案 0 :(得分:2)

您可以查看SecurityContext
抓住Authentication objectcheck the authorities寻找ANONYMOUS个。类似的东西:

SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = sc.getAuthentication();
if(!a.isAuthenticated() || a.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_ANONYMOUS"))) {
    //user not authenticated or ANONYMOUS
} else {
    //user authenticated
}

答案 1 :(得分:0)

This solution对我来说就像是一种魅力。

基本概念是指向servlet而不是登录页面。然后,servlet确定请求是否是ajax请求,如果是,则将重定向作为xml片段返回到登录页面。浏览器可以解释该片段并重定向到登录页面。

答案 2 :(得分:0)

我正在开发包括gwt / gwtp和spring security的企业应用程序。 我添加了会话超时的一些问题,casue下默认使用的SimpleRedirectInvalidSessionStrategy正在执行response.sendRedirect(),我想重定向的html页面响应是由gwt com.google.gwt.user.client.rpc.InvocationException吞下的异常消息。并且没有发生实际的重定向。

解决这个问题

1。我定义了我的cosutom session-manamgemt-filter 为此,您需要在spring-security.xml配置文件集中 <session-management session-fixation-protection="none"/>到今年春天,secuirty将不会采用默认会话管理过滤器。

  1. 定义会话管理过滤器

    在此输入代码

  2. {

     <custom-filter position="SESSION_MANAGEMENT_FILTER" ref="mySessionManagmentFilter"/>   
    
    
    <beans:bean id="mySessionManagmentFilter"
                        class="org.springframework.security.web.session.SessionManagementFilter">
    
                <beans:constructor-arg index="0" ref="mySessionSecurityContextRepository"/>
                <beans:constructor-arg index="1" ref="mySessionAutenticationStrategy"/>
    
                <beans:property name="invalidSessionStrategy">
                    <beans:ref local="myInvalidSessionStrategy"/>
              </beans:property>
            </beans:bean>
    
    
         <beans:bean id="mySessionSecurityContextRepository"
                        class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
                <beans:property name='allowSessionCreation' value='false'/>
            </beans:bean>
    
    
    <beans:bean id="mySessionAutenticationStrategy"
                    class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
            <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"/>
            <beans:property name="maximumSessions" value="1"/>
            <beans:property name="exceptionIfMaximumExceeded" value="false"/>
            <beans:property name="alwaysCreateSession" value="true"/>
        </beans:bean>
    
    
    <beans:bean id="myInvalidSessionStrategy"
                    class="com.my.project.MyInvalidSessionStrategy">
            <beans:constructor-arg value="/login.jsp?timeout=1"/>
        </beans:bean>
    

    }

    这里是custom - MyInvalidSessionStrategy {

    public class MyInvalidSessionStrategy implements InvalidSessionStrategy {
    
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final String destinationUrl;
    
    
    public OperationalInvalidSessionStrategy(String invalidSessionUrl) {
        this.destinationUrl = invalidSessionUrl;
    
    }
    
    @Override
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String exMsg =session timeout ! , need to redirect to login page
        logger.warn(exMsg);
        throw new TimeOutException(exMsg);
    
    }
    

    }

    }

    因此,当超时发生时,新实现会抛出异常.. 例外可以是卡车上的gwt回调onFailure方法

    检查异常的类型,onFailure方法将用户重定向到登录页面。 与Window.Location.replace(GWT.getHostPageBaseURL() + "/login.jsp")