Фильтр проверки сеанса, который выходит из системы по окончании сеанса - PullRequest
5 голосов
/ 10 сентября 2011

У меня есть фильтр проверки сеанса, который выходит из системы по окончании сеанса.

Вот фрагмент кода, но он не работает.Не работает означает, что это не перенаправляет на страницу входа, даже если сеанс заканчивается.

Пожалуйста, помогите мне решить эту проблему.

public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {  
    HttpServletResponse res = (HttpServletResponse) response;  
    HttpServletRequest req = (HttpServletRequest) request;  

    HttpSession s = req.getSession(false);  

    if (s==null)
    {
        //redirect to login page with session expiry message   
    } else {  
        chain.doFilter(request, response);  
    }  
}

1 Ответ

10 голосов
/ 10 сентября 2011

У меня есть фильтр проверки сеанса, который отключает пользователя по окончании сеанса.

Это, честно говоря, не имеет никакого смысла.Если вы зарегистрировали вошедшего в систему пользователя как атрибут сеанса и перехватили статус «вошедшего в систему» ​​на основании присутствия вошедшего в систему пользователя в сеансе, то вам вообще не нужно выходить из системы вручную, когдасеанс истек.Когда сеанс истекает, все его атрибуты в любом случае будут потеряны, и, следовательно, пользователь будет «автоматически» выведен из системы.

Вот пример того, как вы можете войти в систему в 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.
}

Видите ли, когда логин действителен, пользователь сохраняется как атрибут сеанса.Остаток вашего кода может просто проверить, является ли он нулевым или нет, чтобы определить, вошел ли пользователь в систему. Когда сеанс истекает, он автоматически становится нулевым.


этоне перенаправлять на страницу входа, даже если время сеанса истекает

Я понятия не имею, что вы пытаетесь сделать, поскольку первоначальное функциональное требование не имеет смысла.Однако существуют два общих функциональных требования, связанных с истечением срока действия сессии и страницей входа.Я предполагаю, что вам на самом деле нужен любой из них:

  1. "Как перенаправить посетителя на страницу входа, когда он запрашивает страницу, котораяограничено для зарегистрированных пользователей? "

    Вам необходимо создать фильтр и сопоставить его с (общим) шаблоном 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.
        }
    }
    

  2. "Как мнеавтоматически перенаправлять открытую в данный момент страницу на страницу входа по истечении сеанса? "

    Использовать обновление <meta> в сочетании с HttpSession#getMaxInactiveInterval().

    <meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval};url=sessionexpired.jsp">
    

    Это автоматически перенаправит текущую страницу на указанный url каждый раз, когда закончится сеанс.Выражение ${pageContext.session.maxInactiveInterval} будет указывать время истечения сеанса в секундах, как раз то, что нужно атрибуту content.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...