2011-09-10 5 views
4

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

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

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

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); 
    } 
} 
+0

Вы проверили идентификатор sesion в блоке перенаправления? это меняется? Возможно ли, что ваш soft/framework вызывает getSession (true) где-нибудь? – Osw

ответ

9

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

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

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

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


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

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

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

    Вам необходимо создать 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. 
        } 
    } 
    

  2. «Как я автоматически перенаправлять раскрытый текущей страницы на страницу входа в систему, когда истекает сессии?»

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

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

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

+0

У меня есть тег, но он просто перенаправляется на страницу, указанную мной мгновенно. – Makky

+0

@Makky: По-видимому, он напечатал '0'. – BalusC

+0

OK. Не могли бы вы посоветовать мне, как мне автоматически перенаправляться по истечении срока действия сеанса? – Makky

Смежные вопросы