Sprawdź czy sesja istnieje JSF

Mam stronę logowania, na której mam użytkownika do uwierzytelniania nazwy użytkownika i hasła danej osoby. Ta fasola ma zasięg sesyjny. Jeśli ktoś napisze adres URL i spróbuje przeskoczyć stronę logowania, Jak mogę to sprawdzić i przekierować go na stronę logowania?

Z drugiej strony. Załóżmy, że zalogowałem się i pracowałem i nagle wychodzę na chwilę i moja sesja wygasa. Kiedy wracam i próbuję wejść w interakcję z formularzem, wysyła wiadomość ostrzegającą mnie o wygaśnięciu sesji. Jak mogę przekierować ponownie do formularza logowania, gdy to nastąpi?

Z góry dzięki. Mam nadzieję, że się wyjaśnię.

Mojarra 2.1.4, Tomcat 7, Tomahawk 1.1.11

Author: BalusC, 2011-11-16

2 answers

Jeśli ktoś napisze adres URL i spróbuje przeskoczyć stronę logowania, Jak mogę to sprawdzić i przekierować go na stronę logowania?

Wydajesz się używać uwierzytelniania własnego. W takim przypadku należy zaimplementować filtr serwletów . JSF przechowuje session scoped managed beans jako atrybuty HttpSession, więc możesz to sprawdzić w metodzie doFilter():

HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");

if (userManager != null && userManager.isLoggedIn()) {
    chain.doFilter(request, response);
} else {
    HttpServletResponse res = (HttpServletResponse) response;
    res.sendRedirect(req.getContextPath() + "/login.xhtml");
}

Odwzoruj ten filtr na wzorze URL obejmujÄ…cym zabezpieczone strony, np. /app/*.


Kiedy wracam i próbuję wejść w interakcję z formularzem, wysyła wiadomość ostrzegającą mnie o wygaśnięciu sesji. Jak mogę przekierować ponownie do formularza logowania, gdy to nastąpi?

Rozumiem, że dotyczy to żądań Ajax? Dla zwykłych żądań można było użyć <error-page> w web.xml. Jeśli ustawiamy metodę zapisu stanu dla Klienta w web.xml w następujący sposób

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

Nie jest opcją, wtedy trzeba zaimplementować Niestandardowy ExceptionHandler:

public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void handle() throws FacesException {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
            Throwable exception = iter.next().getContext().getException();

            if (exception instanceof ViewExpiredException) {
                facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
                facesContext.renderResponse();
                iter.remove();
            }
        }

        getWrapped().handle();
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

}

(zauważ, że ten przykład przechodzi do viewexpired, więc oczekuje {[13] } jako strony błędu)

Powyższe musi być pieczone przez następujące ExceptionHandlerFactory realizacja:

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
    }

}

Które z kolei należy zarejestrować w faces-config.xml w następujący sposób:

<factory>
    <exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
 16
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:05

Jeśli wdrażasz własny system, możesz dodać atrybut do użytkownika o nazwie session lub cokolwiek innego. Ten atrybut może być boolean , więc przy każdym uruchomieniu sesji można ustawić ten atrybut na true. Napisz metodę o nazwie permission na przykład:

public void permission() throws IOException {

        if(userStatelessBean.getSession() == false) {
            System.out.println("*** The user has no permission to visit this page. *** ");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            context.redirect("login.xhtml");
        } else {
            System.out.println("*** The session is still active. User is logged in. *** ");
        }
    }

Na każdej ze stron jsf (dla tego przykładu ), na której chcesz mieć ograniczenia, możesz dodać następujący kod na samym początku strony:

<f:metadata>
     <f:event type="preRenderView" listener="#{sesija.permission()}"/>
</f:metadata>

Do czego to zmierza do to wywołanie JSF ManagedBean z nazwą obiektu sessija przed renderowaniem strony i sprawdzenie, czy reguły utworzone w podanej metodzie są spełnione, czy nie.

Mam nadzieję, że uznasz to za przydatne,

Dziękuję.
 1
Author: miksiii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 17:03:18