Obsługuj ViewExireException / ajax i wyświetl okno dialogowe Primefaces

Nie przekierowuję ani nie przekazuję mojego użytkownika na inną stronę. Więc kiedy mójSessionExpiredExceptionHandler (rozciąga sięExceptionHandlerWrapper) obsługuje ViewExireException. Chcę, aby użytkownik pozostał na tej samej stronie i wyświetlał okno dialogowe PrimeFaces. Aby powiadomić, że sesja wygasła i że użytkownik musi się ponownie zalogować (na podstawie okna dialogowego). Używam funkcji Servlet 3.1 do logowania / wylogowania użytkownika iBasic/file dla metody auth do mapowania użytkowników na różne role systemu.

Teraz dzieje się tak, że widok / strona jest odświeżany po 2 minutach, ale sesja nie zostaje unieważniona. Dzieje się tak dopiero po drugim odświeżeniu strony, po 4 minutach.

    <session-config>
        <session-timeout>2</session-timeout>
    </session-config>

Edytować: Który jest odświeżany przez metatag:

<meta http-equiv="refresh" content="#{session.maxInactiveInterval}" />

Jak mogę to zrobićSessionExpiredExceptionHandlerunieważnić obiekt sesji (wylogowanie serwletu), gdy wyjątki wystąpią za pierwszym razem, i jak mogę wywołać JavaScript (expireDlg.show ()) na kliencie, aby wyświetlić okno dialogowe PrimeFaces?

Przyjrzałem się innym wątkom, ale nie znalazłem realnego rozwiązania.Limit czasu sesji

SessionExpiredExceptionHandler

    @Override
    public void handle() throws FacesException {
    for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();
        if (t instanceof ViewExpiredException) {
        ViewExpiredException vee = (ViewExpiredException) t;
        FacesContext fc = FacesContext.getCurrentInstance();
        Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
        NavigationHandler nav = fc.getApplication().getNavigationHandler();                

        try {
            requestMap.put("currentViewId", vee.getViewId());

            nav.handleNavigation(fc, null, "Home");
            fc.renderResponse();

        } finally {
            i.remove();
        }                                
        }
    }
    // At this point, the queue will not contain any ViewExpiredEvents.
    // Therefore, let the parent handle them.
    getWrapped().handle();
    }

web.xml

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

questionAnswers(2)

yourAnswerToTheQuestion