У меня есть приложение JSF, работающее на Wildfly 10 и использующее веб-фильтр Filter.java , чтобы проверить, вошел ли пользователь в систему (здесь показан метод doFilter):
@WebFilter("/*")
public class Filter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String requestURI = request.getRequestURI().replaceFirst(";.*", "");
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
// User already logged in ...continue
chain.doFilter(request, response);
return;
}
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
// If ajax request, return special XML response instructing JSF ajax to send a redirect.
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
response.getWriter().printf(LoginCheckFilter.AJAX_REDIRECT_XML, loginURL);
} else {
// User not logged in.Forward to login page
response.sendRedirect(loginURL);
}
}
Кроме того, у меня есть SessionScoped Bean LoginBean.java , чтобы войти в систему пользователя.Каждый логин создает новый сеанс с getSession (true):
@Named("loginBean")
@SessionScoped
@URLBeanName("loginBean")
public class LoginBean extends BasePageBean {
/**
* Login user
*/
public void login() {
HttpSession session = getSession(true);
try {
// login and redirect to correct page ......
} catch (Throwable t) {
return;
}
}
все работает нормально.Но когда я вошел в систему на одной вкладке браузера и попытался войти на второй вкладке браузера, мне нужно дважды нажать кнопку входа, чтобы иметь возможность войти.Отладка, я вижу, что с первой попытки
HttpSession session = request.getSession(false);
в Filter.java возвращает значение Null, и пользователь снова перенаправляется на страницу входа, хотя loginBean создал новый сеанс с:
HttpSession session = getSession(true);
Только когда кнопка входа в систему нажата второй раз, вход будет успешным.Как сеанс может быть нулевым здесь, хотя я явно создаю новый сеанс в моем loginBean для каждой попытки входа в систему.Это какая-то защита от фишинга?или это связано с объемом LoginBean?Я немного застрял с этим на данный момент.
getSession метод выглядит следующим образом:
public static HttpSession getSession(boolean newSession) {
FacesContext facescontext = FacesContext.getCurrentInstance();
if (facescontext == null)
return null;
ExternalContext contx = (ExternalContext) facescontext.getExternalContext();
if (contx == null)
return null;
if (newSession) {
contx.invalidateSession();
}
return (HttpSession) contx.getSession(true);
}
Спасибо