如何区分新登录(新会话)和会话超时

时间:2012-01-18 09:23:27

标签: jsf session-timeout

有人可以让我知道如何区分新登录(新会话)和会话超时 仅在登录时:必须对用户进行身份验证并将其重定向到servlet以加载用户详细信息(在其他screnarios上,用户不得重定向到servlet) 并且在超时时必须将用户重定向到超时页面 识别新会话(用户未登录):
- 由于会话在超时时变为空,因此无法使用会话属性 - 为会话管理设置cookie无效。 当前会话中的cookie已被删除

Cookie cookie = new Cookie("activeSession", null);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setValue("");
httpServletResponse.addCookie(cookie);
getCookieValue(httpServletRequest , "activeSession"); returns null
public static String getCookieValue(HttpServletRequest request, String name) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie != null && name.equals(cookie.getName())) {
                return cookie.getValue();
            }
        }
    }
    return null;
}

当用户登录并创建新会话时,注销或超时(会话失效)后。 之前会话中删除的Cookie将重新显示预设值。

 getCookieValue(httpServletRequest , "activeSession") returns a value; 

如果我使用以下方法,它适用于第一次登录尝试。 在第一次登录会话超时后,过滤器会重定向到超时页面。 当用户在超时后访问同一窗口中的应用程序时,会出现实际问题。

public void doFilter(ServletRequest request, ServletResponse response,FilterChain   filterChain) throws IOException,
{   if ((request instanceof HttpServletRequest)
            && (response instanceof HttpServletResponse)) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;

HttpServletResponse httpServletResponse = (HttpServletResponse) response;

//Check for a new login 
if (httpServletRequest.getSession(false) == null  && httpServletRequest.getRequestedSessionId()==null)
{
// Create a new session
httpServletRequest.getSession();
//Redirect to servlet on 1 st login to fetch details from DB
httpRequest.getRequestDispatcher("/loginServlet").forward(request,response);
}else{

//validate active or timedout sessions. 
boolean isSessionValid = (httpServletRequest.getRequestedSessionId() != null) && !httpServletRequest.isRequestedSessionIdValid();

if(isSessionValid)
{
httpServletResponse.sendRedirect(getTimeoutPage());
}
}
}
filterChain.doFilter(request, response);
}

因此,不会从DB中提取详细信息,并且页面未正确加载。

浏览器:IE 8 服务器:Weblogic服务器

1 个答案:

答案 0 :(得分:2)

您的Cookie方法是不必要的,技术上无效。最大年龄0会使其在处理响应时立即过期。但无论如何,您不需要额外的cookie。 HttpSession本身已经由cookie支持,并且Servlet API已经提供了检查一个和另一个的方法。只需将登录用户存储为HttpSession的属性(后者可以是会话范围的JSF托管bean)。

以下示例应该这样做,假设您已将登录用户存储为具有托管bean名称“auth”的会话范围JSF托管bean的属性。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain   chain) throws ServletException, IOException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    Authenticator auth = (Authenticator) req.getSession().getAttribute("auth");

    if (req.getRequestedSessionId() != null && !req.isRequestedSessionIdValid()) {
        res.sendRedirect(req.getContextPath() + "/timeout.xhtml");
    } else if (auth == null || !auth.isLoggedIn()) {
        res.sendRedirect(req.getContextPath() + "/login.xhtml");
    } else {
        chain.doFilter(request, response);
    }
}
相关问题