2013-06-13 4 views
2

Я использую Spring-Security и Primefaces как представление. Как я могу перенаправить пользователя на страницу входа после таймаута сеанса? У меня есть Tabview и несколько вкладок внутри него. поэтому мне нужно иметь дело с тайм-аутами сеанса в запросах ajax. Есть ли решение?Как бороться с тайм-аутами сеанса в запросах AJAX?

файл Весна-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> 

+0

@BalusC Omnifaces не использует primefaces. –

ответ

5

Если вы поставите конфигурации пространства имен в сторону и использовать конфигурацию «чистые» бобы, вы можете настроить ExceptionTranslationFilter, чтобы сделать его обойти сконфигурированный AuthenticationEntryPoint в случае запроса ajax. Пример этого подробно описан в here.

Идея ExceptionTranslationFilter заключается в том, что она обнаруживает, что перед выполнением запроса было исключено AuthenticationException или AccessDeniedException. В этих случаях, как правило, он должен запускать authenticationEntryPoint, если пользователь не вошел в систему. В случае AccessDeniedException и пользователь вошел в систему, ExceptionTranslationFilter обычно просто возвращает код статуса HTTP 403 (доступ запрещен).

Но, если вы можете настроить ExceptionTranslationFilter как в blog post mentionned above, вы можете обнаружить, если отклоненный запрос является Аякса один, глядя на заголовки HTTP. В этом случае вместо вызова AuthenticationEntryPoint, который отправит перенаправление, вы можете сделать это как thread balusC mentionned, но в ExceptionTranslationFilter вместо этого в jsf ExceptionHandler.

Надеюсь, что эта помощь.

+0

Ссылки мертвы :-( –

0

Я думаю, что в случае безопасности весны и ajax (в jsf) запрос перенаправления для страницы входа уже отправлен обработчику запроса ajax, единственная проблема здесь - это стандартный обработчик запросов ajax для jsf (prime-faces), не обрабатывающий тоже самое.

Я не эксперт jsf, но могу думать о следующем возможном обходе в дополнение к вышеуказанному ответу, который может быть произвольно реализован для точности.

  • Если этот вопрос нужно обращаться только пару страниц JSF затем OnSuccess атрибутов р: может быть предоставлена ​​Аякса тег

    • обработчик будет нести ответственность за определение реакции успеха и перенаправить ответ
    • Если Войти страница может быть сделана HTML/JSP, то он может быть легко обнаружен при отсутствии <?xml тега в responseText в случае переадресации
  • Если этот вопрос должен быть обработан для всего приложения, то заказ визуализатор может быть использован для обеспечения по умолчанию OnSuccess обработчик

Пользовательские Ajax Handler должна храниться в заголовке секции JSF шаблона (либо с помощью визуализации или указав на "OnSuccess" атрибута)

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

Для видеообработки: (в случае обращения с вопросом для всего приложения)

Ref: 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 в случае, из primefaces и переопределить следующий метод:

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

xhr.responseText.indexOf ("

+0

Для меня это работает, кроме того, вы может проверять различные условия, например, некоторый идентификатор, доступный только на странице входа или id, который доступен только в действительном ответе ajax. –

Смежные вопросы