2013-07-23 2 views
0

Я смущен тем, как управляются сеансы в JSF 2.0.Управление сеансом в JSF 2.0

Я создал 4 страницы с логином, данными, информацией и сеансами, которые показывают, как только сеанс истек.

При нажатии на кнопку выхода из системы, это аннулирует сеанс, вызвав следующий метод действия:

public String logout(){ 
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
    return "logout?faces-redirect=true"; 
} 

код перенаправляет меня для выхода страницы, как и ожидалось, но когда я нажимаю кнопку назад браузера он берет меня на странице данных и показывает всю информацию, но я думаю, если сеанс уже истек, тогда он должен показать страницу sessionexpires.

Как достичь желаемой функциональности?

+0

Возможный дубликат кнопки [Избегайте возврата на веб-приложение JSF] (http: // stackoverflow.com/questions/10305718/avoid-back-button-on-jsf-web-приложение) – BalusC

+0

Спасибо большое @BalusC, но все же мой вопрос не является точно кэшированными страницами при нажатии кнопки «Назад», но на кешированных страницах, почему действие выполняется при нажатии из командной кнопки, если я аннулирую сессию –

ответ

3

Тот факт, что вы видите предыдущие страницы, когда пользователь нажимает кнопку «Назад» браузера, указывает, что страницы были кешированы и отображаются в кеше браузера, а не на сервере. Чтобы исправить это, вам необходимо правильно настроить заголовки HTTP-ответов. На это был дан ответ заранее в Making sure a web page is not cached, across all browsers. Просто повторить BalusC, это:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
response.setDateHeader("Expires", 0); // Proxies. 

Наиболее подходящее место для установки этих заголовков является веб-фильтр, как вы, кажется, не нужны какие-либо из JSF вещей там. Вы можете найти дополнительную информацию в ответах на вопрос Avoid back button on JSF web application. Чтобы повторить код BalusC, вы получите:

@WebFilter("/secured/*") 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 

     if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      response.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(req, res); 
    } 

    // ... 

} 

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

Следующее, что нужно сделать, - объяснить JSF, как иметь дело с уже открытыми страницами, когда сеанс был признан недействительным/тайм-аутом. Другими словами, как вы можете иметь дело с ViewExpiredException. Это, в свою очередь, отвечает в How to handle session expiration and ViewExpiredException in JSF 2? и javax.faces.application.ViewExpiredException: View could not be restored для синхронных запросов POST и в Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request для запросов AJAX.

В принципе, для первых вам нужно добавить следующие строки в web.xml:

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

Для последнего я горячо рекомендую вам взглянуть на полезную библиотеку JSF OmniFaces и его FullAjaxExceptionHAndler, который был предназначенные для этой цели.

+0

спасибо alot @skuntsel, но все равно то, что я пытаюсь сделать, - это когда человек нажимает на эту командную кнопку с кеш-страницей, которую он должен выполнить на странице sessionsexpires (как я сделал недействительные сеансы), но не выполнять действие при нажатии этой кнопки –

0

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

Следуйте за this о том, как работает кнопка возврата браузера.

Для решения вашей проблемы вы можете обратиться this.

+0

спасибо @joe, но это не моя проблема, я знаю, что страница кэшируется, как я узнал из [здесь] (http://stackoverflow.com/questions/5619827/how-to- invalidate-session-in-jsf-2-0) от BalusC, но опять же на обратной странице, если я нажму любую командную кнопку, она должна забрать меня на страницу sessionexpire, но не запрашивать страницу этой кнопкой. –

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