2015-10-09 4 views
0


У нас есть приложение JSF 2.0, Primefaces 5.0, Spring Security 3.2.3.RELEASE.
Чтобы обрабатывать тайм-аут сеанса, я использую простые символы idleMonitor и p: dialog & javascript, чтобы отобразить всплывающее окно обратного отсчета и перенаправить его обратно на страницу входа.
Я также внедрил пользовательский CacheControlPhaseListener, чтобы страницы не кэшировались. Я установил no-cache в заголовках ответов в CacheControlPhaseListener.частичный ответ на сессию expire

<lifecycle><phase-listener id="nocache">com..filter.CacheControlPhaseListener</phase-listener></lifecycle> 

У меня также есть Обработка ошибок сконфигурировано в моей web.xml:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/error.jsf</location></error-page> 

Я также осуществила ViewExpiredHandler, расширяющий ViewHandlerWrapper

@Override 
public UIViewRoot restoreView(FacesContext ctx, String viewId) 
{ 
    UIViewRoot viewRoot = super.restoreView(ctx, viewId); 
    try 
    { 
     if (viewRoot == null) 
     { 
      viewRoot = super.createView(ctx, viewId); 
      ctx.setViewRoot(viewRoot); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return viewRoot; 
} 

Проблема, которую я все еще имею это:
1. Когда сеанс заканчивается на незанятой странице (например, странице поиска), и если на странице запускается какое-либо действие ajax, даже если я выхожу из системы, когда Я снова вернусь на страницу (например, Вход-> Главная-> Страница поиска). Я вижу ошибку XML частичного ответа:

<partial-response><changes><update id="blGridId"><table id="blGridId" style="width:100%;"> <tbody> <tr> <td><div id="blTableId" class="ui-datatable ui-widget ui-datatable-scrollable ui-datatable-resizable"><div id="sublTableId_paginator_top" class="ui-paginator ui-paginator-top ui-widget-header ui-corner-top" role="navigation"><span class="ui-paginator-prev ui-state-default ui-corner-all ui-state-disabled"><span class="ui-icon ui-icon-seek-prev">p</span></span><span class="ui-paginator-next ui-state-default ui-corner-all ui-state-disabled"><span class="ui-icon ui-icon-seek-next">p</span></span></div><div class="ui-widget-header ui-datatable-scrollable-header"><div class="ui-datatable-scrollable-header-box"><table role="grid"><thead id="blTableId_head"><tr role="row"><th id="blTableId:j_idt101" class="ui-state-default ui-resizable-column" role="columnheader" style="width:34px; #width:37px;"><span class="ui-column-title"><span style="word-wrap: break-word;white-space: normal;">Client </span></span></th><th id="blTableId:j_idt104" class="ui-state-default


2. Если я ударил обновления браузера, он загружает на предыдущую страницу, и я могу продолжать свои действия.
Пожалуйста, дайте мне знать, что мне нужно сделать в дополнение к приведенному выше, чтобы устранить ошибку частичного ответа. Нужно ли добавлять фильтр сервлета, чтобы аннулировать сеанс?
Я был бы очень признателен за любую помощь и отзывы об этом, так как это высокий приоритет.

+0

@BalusC: Я не совсем понимаю резолюцию, приведенную в http://stackoverflow.com/questions/28317891/spring-security-login-after-session-expiration-redirects-to-last-jsf-ajax- reques - нужно ли перенаправить на страницу по умолчанию после входа? – srmthy4

+0

Используйте те же настройки. То есть сообщите Spring безопасности, чтобы она всегда перенаправлялась к указанному целевому URL после входа в систему. – BalusC

+0

О. спасибо, я попробую. – srmthy4

ответ

0

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

Основная причина: Весенняя безопасность сохраняет последний запрос перед перенаправлением клиента для аутентификации. После этого Spring Security попытается выполнить запрос снова, когда пользователь посещает страницу последнего запроса. К сожалению, запрос был ajax/partial, и его представление истекло -> частичное содержимое xml было возвращено.

Простой способ избавиться от этой проблемы - это удаление поведения безопасности Spring Security. Класс SavedRequestAwareAuthenticationSuccessHandler используется для обработки такого поведения. Настроить как:

<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
     p:authenticationManager-ref="authenticationManager" 
     p:authenticationFailureHandler-ref="authenticationFailureHandler" 
     p:authenticationSuccessHandler-ref="authenticationSuccessHandler" 
     p:usernameParameter="username" 
     p:passwordParameter="password"> 
    </bean> 
... 

<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler" 
     p:defaultTargetUrl="/" 
     p:alwaysUseDefaultTargetUrl="true"/> 

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

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

  • Нет связанных вопросов^_^