Ответ 1
Если кто-то пишет URL-адрес и пытается перейти на страницу входа в систему, как я могу проверить это и перенаправить его на страницу входа?
Кажется, вы используете самообслуживаемую аутентификацию. В этом случае вам необходимо реализовать сервлет-фильтр. JSF хранит управляемый сеанс beans как атрибуты HttpSession
, поэтому вы можете просто проверить его в методе 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");
}
Сопоставьте этот фильтр с шаблоном URL-адреса, охватывающим защищенные страницы, например. /app/*
.
Когда я возвращаюсь и пытаюсь взаимодействовать с формой, он отправляет сообщение, предупреждающее меня о завершении сеанса. Как я могу перенаправить снова в форму входа, когда это произойдет?
Я понимаю, что это касается запросов Ajax? Для обычных запросов вы могли бы использовать <error-page>
в web.xml
. Если при настройке способа сохранения состояния для клиента в web.xml
выполните следующие действия
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
не является опцией, тогда вам нужно реализовать пользовательский 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;
}
}
(обратите внимание, что этот конкретный пример перемещается в viewexpired
, поэтому он ожидает /viewexpired.xhtml
как страницу с ошибкой)
Вышеупомянутое должно быть испечено следующей ExceptionHandlerFactory
реализация:
public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
}
}
который, в свою очередь, должен быть зарегистрирован в faces-config.xml
следующим образом:
<factory>
<exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>