Если фильтр вообще не вызывается, т. Е. Метод doFilter()
никогда не выполняется, тогда отображение фильтра совершенно неверно.Вам необходимо подтвердить <filter-mapping>
в web.xml
.Он должен отображаться либо на <servlet-name>
из FacesServlet
, либо на <url-pattern>
, охватывающем ограниченные страницы, такие как /app/*
, /secured/*
и т. Д., В зависимости от структуры вашей папки.
Если фильтр действительно вызван, то ваш логический поток кода явно неверен.Давайте посмотрим на вашу первую попытку:
HttpSession session = req.getSession(false);
if (!session.isNew()) {
if(ManageCustomerMbeans.AUTH_KEY!=null){
chain.doFilter(req, resp);
}
} else {
//Session has expired - redirect to login.jsp
}
Этот поток явно неправильный.Во-первых, вы получаете сеанс с false
, что означает, что он потенциально может вернуть null
, но вы никогда не проверяете это.Затем вы проверяете, был ли недавно создан сеанс, который может никогда быть true
, если getSession(false)
возвращает ненулевой сеанс.Итак, первый блок if
вводится всегда.Затем вы проверяете, является ли постоянное значение не нулевым, но это может никогда быть false
, поскольку это, по-видимому, константа.Итак, ваш chain.doFilter()
всегда вызывается .Предполагая, что константа представляет ключ атрибута, вам нужно переписать его следующим образом:
HttpSession session = req.getSession(false);
if (session != null && session.getAttribute(ManageCustomerMbeans.AUTH_KEY) != null) {
chain.doFilter(req, resp);
} else {
resp.sendRedirect(req.getContextPath() + "/login.jsp");
}
Это позволит проверить, не является ли сеанс ненулевым и содержит ли вошедший в систему пользователь.Если true, тогда продолжайте запрос, иначе перенаправьте на страницу входа.Вам нужно только убедиться, что страница входа не соответствует отображению фильтра, иначе вам нужно добавить дополнительную проверку в блоке if
в URI запроса.
Ваша вторая попытка также неверна:
if (!(pageRequested.contains("Login.jsp")&&session.getAttribute(ManageCustomerMbeans.AUTH_KEY)==null)) {
resp.sendRedirect("./error");
} else {
chain.doFilter(request, response);
}
Это всегда перенаправляет на страницу ошибки, если пользователь не заходит на страницу входа.Это только продолжит запрос, если пользователь заходит на страницу входа в систему, когда не вошел в систему.Эта логика не имеет смысла.Но если вы говорите, что «это не работает», то это может означать только неправильное сопоставление фильтров.