2015-08-27 65 views
0

在我們的Java EE應用程序中,我們使用基於容器的證書認證。我們已經創建了JAASLoginModule,它使用所有必需的方法實現了LoginModule接口。我們已經配置了Wildfly和TomEE服務器同時使用認證和SSL通道安全這個模塊,一切都以用戶登錄順利:基於Java EE容器的證書認證註銷

  • 用戶打開瀏覽器和應用程序;
  • 選擇證書;
  • JSF會話已創建,現在他已登錄;

另一個故事是與註銷。僅僅銷燬JSF會話是不夠的 - 註銷後,如果您只需點擊返回,瀏覽器就會從緩存中獲取證書信息,重新創建會話並讓您執行相同的操作。有時甚至瀏覽器重啓也無濟於事。 我找不到從JSF託管bean的LoginModule中調用註銷方法的有效方法。

任何方式來解決這個問題?

回答

0

你的問題直接與瀏覽器有關,所以你需要告訴瀏覽器每次註銷時都要從你的頁面「重新啓動」緩存,爲了讓它認爲這是第一次客戶端正試圖進入該頁面。與Chrome和Firefox中的私人窗口一樣。

試試這個代碼:

//... 
response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server 
response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance 
response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale" 
response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility 

//can check userId or something likes this.In this sample, i checked with userName. 
String userName = (String) session.getAttribute("User"); 
if (null == userName) { 
    request.setAttribute("Error", "Session has ended. Please login."); 
    RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); 
    rd.forward(request, response); 
} 

來源:How to clear browser cache using java

+0

謝謝。這可以用FacesContext來完成嗎? –

+0

在java(或任何其他語言和/或容器恕我直言)的服務器端沒有辦法強制這一點。我做了大量的研究,唯一可靠的方法是重新啓動瀏覽器。 – mvreijn