2012-06-06 49 views
0

我正在開發一個安全的Web應用程序。我必須開發一個servlet來自定義控制它的訪問。在Java servlet中顯式管理會話以保護Web應用程序

例如,我有home.jsp廣泛打開,content.jsp依賴於URL模式。

如果它是GET content.jsp,它應該打開以顯示內容列表。 如果它是content.jsp?chapter = 1 & detail = true,它應該檢查用戶是否登錄,只有當用戶具有適當的訪問權限時,纔會授予權限,否則將其重定向到登錄頁面。

我對Java中的JSESSIONID管理感到困惑。默認情況下,任何JSP都會在沒有人的情況下自動創建一個會話。我知道我可以使用@page session =「false」來覆蓋它的默認行爲。

所以,我想的邏輯會是這樣

  1. 如果用戶(未登錄還)GET針對home.jsp,我不應該在servlet的創建的任何會議。但是JSP應該創建一個。我在HTTP請求頭中發現,它已經發送了JSESSIONID值。但是,如何在服務器端,我不會通過httpServletRequest.getSession(false)返回任何會話?

  2. 如果用戶想要獲取content.jsp?chapter = 1 & detail = true,我會將其重定向到logon.jsp。提交登錄表單後,我應該使用httpServletRequest.getSession(true)在服務器端(在返回之前)創建新會話嗎?以下任何JSP頁面訪問是否會創建新會話?

  3. 當用戶註銷時,我必須調用session.invalidate()來使其失效。但是,下面的任何JSP頁面是否會創建一個新的會話ID?

我只是通過

When should I call getSession(true) and getSession(false)? I assume per user session, I should call getSession(true) once. 
Which session id should I use (trust) to identify if the user is truly logged on? 

由於混淆。

回答

2

會話和訪問控制沒有太多共同之處。未經身份驗證的用戶可能有會話。例如,它可以用於存儲偏好。

一旦通過身份驗證,您可以保留相同的會話,但會將用戶及其授權的身份存儲在會話中。您應該將會話視爲一個可以存儲給定用戶屬性的地方,該地點將持續與您的Web應用程序進行會話。

要恢復,會話的存在並不意味着用戶已通過身份驗證。驗證機制存儲在會話中的某些「已驗證」標誌或會話中的某些標識的存在是您必須檢查以瞭解用戶是否經過驗證的。

0

這工作得很好

回到Home.jsp

session = request.getSession(false); 
//false: new session will not be created 

if(session == null){ 
    //not in a session 
    //allow to view the home.jsp page and to login 
    //set an attribute into session 
    session.setAttribute("authorized","yes"); 
} 
else{//in case a default session automatically establishes 
    if(session.getAttribute("authorized")==null){ 
    //not in a valid session 
    //allow to login 
    } 
    else{//already in session, so cann't view the login page 
    //redirect to the home page by "RequestDispatcher" 
    } 

接觸。JSP

只是做同樣的事情,在這裏像
如在休會期間,重定向回到Home.jsp
2-如果會話,但session.getAttribute("authorized")給人null,然後重定向也回到Home.jsp
3-如果在會話和session.getAttribute("authorized")給出值"yes",然後
允許contact.jsp

當註銷

session.removeAttribute("authorized"); 
session.invalidate(); 

但你會面臨一個問題。當你在contact.jsp並點擊瀏覽器的後退按鈕,你會
看到針對home.jsp即登錄頁面OR當你登出,並在logout.jsp並點擊瀏覽器的後退
按鈕,會看到contact.jsp。爲了避免這些,你必須把這些3線在每一頁
要訪問控制。在你的情況下,針對home.jsp和contact.jsp

<% 
    response.setHeader("Cache-Control","no-cache"); 
    response.setHeader("Cache-Control","no-store"); 
    response.setDateHeader("Expires", -1); 
%> 
相關問題