У меня есть фильтр проверки сеанса, который регистрирует от пользователя, когда сессия истекла.
Это делает честно никакого полного смысла. Если вы храните зарегистрированного пользователя в качестве атрибута сеанса и перехватываете статус «вошедшего в систему» в зависимости от наличия вошедшего пользователя в сеансе, тогда вам не нужно вручную вручную выходить из системы, когда сессия истекла. Когда сессия закончится, все ее атрибуты будут потеряны в любом случае, и, следовательно, пользователь «автоматически» выйдет из системы.
Вот пример того, как вы можете войти пользователю в doPost()
о наличии servlet, который вызывается с помощью POST представить в форме входа JSP.
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("userhome"); // Redirect to user home page.
} else {
request.setAttribute("errormessage", "Unknown login, try again"); // Set error message.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Redisplay login form.
}
Вы видите, что, когда логин действителен, пользователь хранится как атрибут сеанса. Остаток вашего кода может просто проверить, является ли он нулевым или не определяет, вошел ли пользователь в систему. Всякий раз, когда сеанс истекает, он автоматически становится нулевым.
это не перенаправляется на страницу входа в систему, даже если сессия истекает
Я понятия не имею, что вы пытаетесь сделать, так как первоначальное функциональное требование не имеет смысла , Однако существуют два общих функциональных требования, связанных с истечением сеанса и страницей входа. Я думаю, что вы на самом деле нужно либо один из них:
«? Как перенаправить посетителя на страницу входа в систему, когда он запрашивает страницу, которая ограничен авторизированным пользователям»
Вам необходимо создать filter и сопоставить его с шаблоном (общим) URL-адресами ограниченной страницы. В фильтре просто проверьте, присутствует ли пользователь в сеансе, а затем продолжайте цепочку, иначе перенаправляйтесь на страницу входа.
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
response.sendRedirect("login"); // No logged-in user found, so redirect to login page.
} else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
}
«Как я автоматически перенаправлять раскрытый текущей страницы на страницу входа в систему, когда истекает сессии?»
Обновление <meta>
в сочетании с HttpSession#getMaxInactiveInterval()
.
<meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=sessionexpired.jsp">
Это будет автоматически перенаправлять текущую страницу в данной url
всякий раз, когда сессия истекает. Выражение ${pageContext.session.maxInactiveInterval}
будет содержать время окончания сеанса в секундах, что и требуется атрибуту content
.
Вы проверили идентификатор sesion в блоке перенаправления? это меняется? Возможно ли, что ваш soft/framework вызывает getSession (true) где-нибудь? – Osw