Я пытаюсь выполнить регистрацию на основе jsf2
формы, где пользователь может сразу перейти по выбранному URL-адресу после перенаправления на login-page
.Как это можно сделать?Мои текущие настройки следующие (с использованием glassfish 3
)
Web.XML
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsf</form-login-page>
<form-error-page>/login.jsf</form-error-page>
</form-login-config>
</login-config>
<security-constraint> //(omitted) all pages except login.jsf requires login </security-constraint>
Управляемый EJB-компонент, управляемый сессией,
public String login(){
try{
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
request.login(username, pwd);
loggedInUser = userBean.findByLogin(username);
username = null;
pwd = null;
//context.getExternalContext().redirect((String)request.getAttribute("from"));
return "/index?faces-redirect=true";
} catch(Exception e){
logger.log(Level.FINE, "login failed: {0}", e.getMessage());
JsfUtil.addErrorMessage("Login failed");
return null;
}
}
Из другого вопроса, который я получилсовет использовать фильтр вместо содержащегося обработанного перенаправления на страницу входа в систему и сохранить URL-адрес перед перенаправлением в качестве атрибута в запросе, например так:
public class LoginFilter implements Filter {
private String loginPage = "/login.jsf";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
ServletException {
if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// is session expire control required for this request?
if (httpServletRequest.getUserPrincipal() == null) {
// User is not logged in, redirect to login page.
httpServletRequest.setAttribute("from", httpServletRequest.getRequestURI());
httpServletResponse.sendRedirect(loginPage);
}
else
filterChain.doFilter(request, response);
}
}
@Override
public void destroy() {
}
}
При том же шаблоне URL, установленном на тот жекак сумма всех ограничений безопасности.Проблема заключается в том, как совместить это с логином на основе контейнера.Если оставить метод авторизации login-config как FORM, фильтр не будет выполнен.При его удалении для метода auth устанавливается значение BASIC, что 1. приводит к тому, что моя форма не отображается, и 2. для httpServletRequest.getUserPrincipal () веб-браузер автоматически устанавливает кэшированное значение, поэтому даже если фильтр выполняется, if-утверждение всегда будет ложным.Из того, что я знаю, нет способа удержать браузер от этого, даже если сеанс признан недействительным.
Есть ли какое-либо решение для этого?