2012-01-18 103 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); 
    } 
}