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
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>
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ę.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