2

I am using Spring-Security and Primefaces as view. How can i redirect user to login page after session timeout? I have a Tabview and several tabs inside it. so I need to deal with session timeouts in ajax requests. Is there any solution?

Spring-security.xml file

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

4

2 回答 2

4

如果您将命名空间配置放在一边并使用“纯”bean 配置,您可以自定义ajax 请求ExceptionTranslationFilter以使其绕过配置AuthenticationEntryPoint此处详细说明了一个示例。

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

但是,如果您可以像上面提到ExceptionTranslationFilter博客文章中那样自定义,您可以通过查看 http 标头来检测被拒绝的请求是否是 ajax 请求。在这种情况下,AuthenticationEntryPoint您可以像线程 balusC 提到的那样调用 , 而不是调用,ExceptionTranslationFilter而不是在 jsf ExceptionHandler 中执行它。

希望这有帮助。

于 2013-06-13T20:16:30.093 回答
1

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

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

  • 如果只需要为几个 jsf 页面处理此问题,则可以提供 p:ajax 标记的 onsuccess 属性

    • 处理程序将负责确定成功响应和重定向响应
    • 如果登录页面可以制作成html/jsp,那么<?xml在redirect的情况下可以很容易地检测到responseText中没有标签
  • 如果需要为整个应用程序处理此问题,则可以使用自定义渲染器来提供默认的 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);
}
于 2013-06-24T06:49:13.723 回答