2012-04-26 494 views
4
<% 
    response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");//HTTP 1.1 
    response.setHeader("Pragma","no-cache"); //HTTP 1.0 
    response.setDateHeader ("Expires", 0); //prevents caching at the proxy server 
%> 

註銷後,對正在添加的登錄頁面,如果您單擊後退按鈕,它顯示了它在登陸舊的一頁。我使用上述一個jsp 3個系和我包括這在我所有jsps裏面的身體標記。這對某些jsps不起作用。有什麼事情我們需要考慮在loggout之後停止緩存。如果一個jsp有Post方法的表單,這種技術不起作用。上後退按鈕緩存問題註銷後點擊

在我的註銷操作中,我正在執行此操作。

Cookie logoutCookie = new Cookie("somename", null); 
logoutCookie.setPath("/somename"); 
logoutCookie.setMaxAge(0); 
ServletActionContext.getResponse().addCookie(logoutCookie); 

謝謝。

回答

2

我包括這在我的身體標籤內的所有JSP

這可能是太晚了當HTTP響應已經在t提交帽子點。當X個字符已經被寫入時,HTTP響應將被提交,在你的情況下將是HTML <head>。您需要將這些行放在JSP文件的最頂端,而不是HTML表示的<body>


在一個不相關的說明中,通過將相同的代碼行復制到多個文件中,您犯了一個巨大的設計錯誤。這不是DRY。無論何時您需要複製代碼,您都應該停下來問問自己是否沒有一個的地方來執行特定的代碼。在你的情況下,你應該使用Filter來代替。有關具體示例,請參閱此答案:Prevent user from seeing previously visited secured page after logout。另外,在JSP中編寫Java代碼是一種不好的做法。檢查How to avoid Java code in JSP files?

此外,您的註銷方法很奇怪。不要將用戶名存儲在某個自定義Cookie中。你基本上是重新開始會議。只需將登錄用戶存儲爲會話屬性,並使整個會話無效併發送重定向。

request.getSession().invalidate(); 
response.sendRedirect(request.getContextPath() + "/home.jsp"); 

有關背景資料會話,閱讀本:How do servlets work? Instantiation, sessions, shared variables and multithreading

+0

在不允許頁面被緩存後,我在fire狐狸中獲取文檔過期消息。這是當我回到頁面,這是POST請求的某些操作的結果。什麼是最好的解決方案。我無法在這裏使用GET,謝謝。 – MadhuB 2012-08-20 12:14:20

+0

答案將是發送重定向,但由於這是GET,故事結束。與它一起生活,這就是POST的工作原理。 – BalusC 2012-08-20 12:16:40

0

你試過response.setHeader("Cache-control","no-store"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", -1);?我認爲你在正確的地方錯過了報價。

+0

是的,我試過這個。不適用於某些網頁。 – MadhuB 2012-04-26 11:52:09

+0

'不適用於某些網頁'不是真的有幫助。你是否每次都要登錄這個人?運行中是否有過濾器?你如何檢查用戶是否首先被驗證? – KodeSeeker 2012-04-26 12:31:09

2

如果您使用瀏覽器的後退按鈕,則無法執行任何操作。該頁面將始終來自緩存。

只要確保在用戶單擊註銷時使會話無效。這樣,當用戶點擊「返回」並嘗試使用該頁面時,他將被重定向到登錄頁面(如果您的站點編程正確)。

[編輯]

這裏是我們把有沒有緩存的HTTP 1.1頭:

httpResponse.setHeader("Cache-Control", "private,no-store,no-cache"); 
+0

我不在這裏使用會話。我只使用Cookie來獲取登錄的用戶詳細信息。 – MadhuB 2012-04-26 11:52:23

+1

那麼,無論是否有會話,你是在討論瀏覽器的後退按鈕還是應用程序中的某個後退按鈕? – tom 2012-04-26 11:54:01

+0

@Tom ::我的註銷按鈕是一個Ajax調用.. ajax調用結束後,它的重定向到登錄頁面。我可以在我的Ajax調用請求上設置「no-cache」選項嗎? – user1050619 2014-05-06 23:48:35

0

創建一個會話屬性讓我們說「有效」,並與其他任何值,那麼在JSP空初始化,只是登錄憑據後被匹配。現在創建一個驗證。jsp用下面的代碼:

<% 
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
if(session.getAttribute("valid")==null) 
{ 
    out.println("<script>parent.location.href='login.jsp'</script>"); 
} 
%> 

現在只需將這個jsp文件包含在每個jsp頁面上並完成。不要忘記寫「session.invalidate();」在logout.jsp

希望它能工作.. !!!