【问题标题】:How to deal with session timeouts in AJAX requests?如何处理 AJAX 请求中的会话超时?
【发布时间】:2013-06-10 00:57:15
【问题描述】:

我使用 Spring-Security 和 Primefaces 作为视图。会话超时后如何将用户重定向到登录页面?我有一个 Tabview 和里面的几个选项卡。所以我需要处理 ajax 请求中的会话超时。有什么解决办法吗?

Spring-security.xml 文件

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">



<http auto-config='true' use-expressions="true">
    <intercept-url pattern="/login" access="permitAll"/>
    <intercept-url pattern="/pages/*" access="hasRole('admin')" />
    <intercept-url pattern="/j_spring_security_check" access="permitAll"/>        
    <logout logout-success-url="/login.xhtml" />
    <form-login login-page="/login.xhtml"
                login-processing-url="/j_spring_security_check"                                                       
                default-target-url="/pages/index.xhtml"
                always-use-default-target="true"                                                        
                authentication-failure-url="/login.xhtml"/>
</http>


<!--Authentication Manager Details -->    
<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="customUserDetailsService">
        <!--            <password-encoder hash="md5"/>-->
    </authentication-provider>
</authentication-manager>

【问题讨论】:

  • @BalusC Omnifaces 不使用primefaces。

标签: spring jsf jsf-2 primefaces spring-security


【解决方案1】:

我认为在spring security和ajax(在jsf中)的情况下,登录页面的重定向请求已经发送到ajax请求处理程序,这里唯一的问题是jsf(prime-faces)的ajax标准请求处理程序没有处理一样。

我不是 jsf 专家,但除了上述答案之外,我可以考虑以下可能的解决方法,可以选择实施以确保准确性。

  • 如果这个问题只需要处理几个jsf页面,那么可以提供p:ajax标签的onsuccess属性

    • 处理程序将负责确定成功响应和重定向响应
    • 如果登录页面可以做成html/jsp,那么在responseText中没有&lt;?xml标签的情况下可以很容易检测到重定向
  • 如果需要为整个应用程序处理此问题,则可以使用自定义渲染器来提供默认的 onsuccess 处理程序

自定义 Ajax 处理程序需要保存在 jsf 模板的标题部分(使用渲染器或通过指定“onsuccess”属性)

function handleAJAX(data,status,xhr) {
        if (xhr.responseText.indexOf("<?xml") == -1) {
            window.location.href="login.jsp";
    }
}

对于渲染器:(以防整个应用程序出现问题)

参考:http://docs.oracle.com/javaee/6/tutorial/doc/bnaxh.html

人脸配置

<render-kit>
<client-behavior-renderer>
        <client-behavior-renderer-type>org.primefaces.component.AjaxBehaviorRenderer</client-behavior-renderer-type>
        <client-behavior-renderer-class>test.component.TestRenderer</client-behavior-renderer-class>
    </client-behavior-renderer>
</render-kit>

TestRenderer to extend org.primefaces.component.behavior.ajax.AjaxBehaviorRenderer 在素面的情况下并覆盖以下方法:

public String getScript(ClientBehaviorContext behaviorContext,
        ClientBehavior behavior) {
AjaxBehavior ajaxBehavior = (AjaxBehavior) behavior;
ajaxBehavior.setOnsuccess("handleAJAX(data,status,xhr)");
return super.getScript(behaviorContext, behavior);
}

【讨论】:

  • xhr.responseText.indexOf("
  • 对我来说,除此之外,您可以检查各种条件,例如某些仅在登录页面中可用的 id 或仅在有效 ajax 响应中可用的 id。
【解决方案2】:

如果您将命名空间配置放在一边并使用“纯”bean 配置,您可以自定义 ExceptionTranslationFilter 以使其在 ajax 请求的情况下绕过配置的 AuthenticationEntryPoint。这方面的一个例子在here 中有详细解释。

ExceptionTranslationFilter 的想法是它检测到在执行请求之前抛出了 AuthenticationException 或 AccessDeniedException。在这些情况下,如果用户未登录,它通常应该启动 authenticationEntryPoint。在 AccessDeniedException 并且用户已登录的情况下,ExceptionTranslationFilter 通常只会返回一个 http 状态代码 403(禁止访问)。

但是,如果您可以像blog post mentionned above 一样自定义ExceptionTranslationFilter,您可以通过查看http 标头来检测被拒绝的请求是否是ajax 请求。在这种情况下,您可以像 thread balusC mentionned 那样调用 AuthenticationEntryPoint,而不是调用 AuthenticationEntryPoint,而不是在 jsf ExceptionHandler 中这样做。

希望对您有所帮助。

【讨论】:

  • 链接失效:-(
猜你喜欢
  • 2010-11-03
  • 2011-04-17
  • 1970-01-01
  • 2012-06-27
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多