2011-05-28 81 views
1

我在那裏完成一個小的Java Web應用程序管理客戶端的影片庫趕牛任務。這項任務是爲了使用cookie對應用程序提供一些安全性,以便「黑客」不能猜測導致應用程序另一部分的URL之一。用戶將被引導到登錄到網站,而不是被允許瀏覽其他頁面,直到登錄Java的Web應用程序安全使用cookie

的Web應用程序的部分是:

1. index.html 
2. VideoServlet 
3. listvideos.jsp 
4. addvideo.jsp 
5. videologin,jsp 

入口點是請求的URL http://localhost:8080/videos,這加載index.html文件。此頁面只有一個鏈接,可將用戶重定向到VideoServlet。從那裏開始,servlet將HTTP請求和響應轉發給listvideos.jsp,如果用戶想這樣做,它有一個鏈接來添加視頻。我無法理解如何使用Cookie來實現安全,而在MVC2模式藏在心裏

(該servlet是控制器,JSP的是視圖)。

這裏是我想出的程序流程,但我想我錯過了點某處:

  1. 用戶輸入URL http://localhost:8080/videos,默認情況下拉動index.html文件。

  2. index.html文件基本上將HTTP Get至VideoServlet。該servlet以某種方式知道用戶尚未登錄,因此將請求/響應轉發給videologin.jsp。

  3. 登錄提出並要求用戶輸入密碼(這是一個標準的HTML形式)。用戶輸入密碼並點擊提交。這會將一個HTTP Post發送到servlet。

  4. 這個servlet檢查密碼,如果正確,用戶登錄並且servlet轉發到listvideos.jsp。

我不明白哪裏餅乾進來或者他們如何能幫助防止黑客猜測URL,並獲得直接訪問,例如,addvideos.jsp。是否使用cookie來驗證用戶是否已經登錄?

回答

3

Cookie是一些純文本值(通常存儲在瀏覽器緩存中的文本文件中),可用於在客戶端存儲數據。當用戶向特定的URL發出請求時,存儲在該服務器(域)上的所有cookie都會與它一起傳遞,以便服務器可以讀取這些值。你可以在你的servlet中設置一個這樣的cookie(在你的情況下,當用戶登錄時,創建一個cookie並存儲一個值(例如username = josh)。你可以在你的servlet中這樣做。後來登錄成功後登錄的servlet。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // Verify login, and get the username. Assume it's josh 

    Cookie cookie = new Cookie("username", "josh"); 
    cookie.setMaxAge(60*60*24); // 24 hours for expiry 
    response.addCookie(cookie); 

} 

,您可以檢查該cookie的存在,如果存在,則在用戶登錄。如果沒有,你可以重定向發送到登錄頁面

你可以在你的servlet中檢查這樣的cookie。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    Cookie[] cookies = request.getCookies(); 

    String username = null; 

    for (Cookie c : cookies) { 
     if ("_username".equals(c.getName())) { 
      username = c.getValue(); 
      break; 
     } 
    } 

    if (username == null) { 
     // Not Logged in. Redirect to Login 
    } 

    // User Logged In. Proceed 
} 

而不是將此代碼放入所有Servlets + JSP中,您可以輕鬆將其放入Servlet Filter類中。您可以在這裏閱讀更多關於:http://javaboutique.internet.com/tutorials/Servlet_Filters/

理想情況下,您還可以提供註銷功能,該功能將刪除分配給用戶名cookie的值,並將其替換爲空值。

我展示了上面的例子,因爲你提到你需要使用cookies來完成你的任務。但是,如果可以,請嘗試使用會話(大多數情況下會使用Cookie)來存儲登錄的用戶詳細信息。通過會話,您可以使用會話超時來確保閒置的用戶在一段時間後會自動註銷,等等。

0

index.html文件基本上將HTTP Get至VideoServlet。該servlet以某種方式知道用戶尚未登錄,因此將請求/響應轉發給videologin.jsp。

不知何故知道是由於在請求中查找cookie的存在。確保cookie的內容受到message authentication code的保護,因此您可以確定您的服務器實際上分發了cookie。將cookie編碼爲客戶端使用的特定IP地址也是一個好主意,因此攻擊者不能hijack a cookie。 (如果客戶端在會話期間改變了IP地址,要求他們再次登錄並不可怕,也許令人討厭,但並不意外)。

servlet檢查密碼,如果正確,用戶登錄並且servlet轉發到listvideos.jsp。

的用戶登錄 - 設置cookie到瀏覽器的未來需求。