2013-05-25 108 views
3

最初有一個「登出」鏈接只在我的索引頁,所以我只想失效了會議,併發送回索引頁....如何將請求發送回發送它的頁面?

但現在我有一個「登出每個頁面頂部的「」鏈接。那麼我怎麼能派遣一個請求返回到「退出」之後在點擊會話失效後的同一頁面呢?

HttpSession hs = request.getSession(); 
if (hs != null) { 
    hs.invalidate(); 
    RequestDispatcher rd = request.getRequestDispatcher("index.jsp"); 
    rd.forward(request, response); 
} 
+0

您可以向索引頁面發送'request'屬性,並在登錄時使用該屬性重定向到登錄處理程序中的當前頁面。您可以將該請求屬性保留爲隱藏字段等。 – NINCOMPOOP

+0

可能重複/類似於以下內容:[HttpServletRequest - 如何獲取引用URL?](http://stackoverflow.com/questions/2648984/httpservletrequest-how-to-獲取引用URL)和這:[如何使用request.getHeader(「Referer」)](http://stackoverflow.com/questions/5536577/how-to-use-request-getheaderreferer) – informatik01

回答

1

使用HttpServletRequest#getHeader()檢索HTTP引用。

HttpSession session = request.getSession(); 
if(session !=null) { 
    session.invalidate(); 
    RequestDispatcher rd; 
    String referrer = request.getHeader("Referer"); 
    if (referrer != null) { 
     URL ref = new URL(referrer); 
     // assuming logout request came from the same application 
     referrer = ref.getPath().substring(request.getContextPath().length()); 
     rd = request.getRequestDispatcher(referrer); 
    } else { 
     rd = request.getRequestDispatcher("/index.jsp"); 
    } 
    rd.forward(request, response); 
} 

substring()做是爲了刪除該應用程序的上下文根,因爲調度員也將被添加相同的。如果不移除它,結果路徑將變爲無效(前面有兩個上下文/webapp/webapp/..)。

0

您可以存儲前一頁和當前servletContext的會話屬性。每當有新的請求時,從會話中獲取當前的servletContext並將其設置爲之前的上下文,然後將當前的servletContext替換爲新請求的servletContext。現在,如果您想要將用戶發送到上一個視圖,請從會話中獲取以前的視圖並使用response.sendRedirect((String)session.getAttribute("previousPath"))。 對我很好。