У меня есть фильтр проверки сеанса, который отключает пользователя по окончании сеанса.
Это, честно говоря, не имеет никакого смысла.Если вы зарегистрировали вошедшего в систему пользователя как атрибут сеанса и перехватили статус «вошедшего в систему» на основании присутствия вошедшего в систему пользователя в сеансе, то вам вообще не нужно выходить из системы вручную, когдасеанс истек.Когда сеанс истекает, все его атрибуты в любом случае будут потеряны, и, следовательно, пользователь будет «автоматически» выведен из системы.
Вот пример того, как вы можете войти в систему в doPost()
из сервлет , который вызывается отправкой 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.
}
Видите ли, когда логин действителен, пользователь сохраняется как атрибут сеанса.Остаток вашего кода может просто проверить, является ли он нулевым или нет, чтобы определить, вошел ли пользователь в систему. Когда сеанс истекает, он автоматически становится нулевым.
этоне перенаправлять на страницу входа, даже если время сеанса истекает
Я понятия не имею, что вы пытаетесь сделать, поскольку первоначальное функциональное требование не имеет смысла.Однако существуют два общих функциональных требования, связанных с истечением срока действия сессии и страницей входа.Я предполагаю, что вам на самом деле нужен любой из них:
"Как перенаправить посетителя на страницу входа, когда он запрашивает страницу, котораяограничено для зарегистрированных пользователей? "
Вам необходимо создать фильтр и сопоставить его с (общим) шаблоном 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
.