HttpServletRequest.getSession (false) возвращает ноль в webFilter - PullRequest
0 голосов
/ 02 октября 2018

У меня есть приложение 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);
  }

Спасибо

...