2012-01-18 126 views
0

有人可以让我知道如何区分新登录(新会话)和会话超时。
仅在登录时:用户必须经过身份验证并重定向到servlet才能加载用户详细信息(在其他screnarios用户不能重定向到servlet) 并且超时用户必须重定向到超时页面。
识别新会话(用户未登录):
- 由于会话在超时时间变为空,因此无法使用会话属性。
- 为会话管理设置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); 
} 

因此,详细信息不会从数据库中获取,并且页面加载不正确。

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

回答

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