3

最初只有在我的索引页面上有一个“退出”链接,所以我只会使会话无效并将其发送回索引页面......

但现在我在每一页的顶部都有一个“退出”链接。那么,在使会话无效后 ,如何将请求发送回单击“注销”的同一页面?

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

2 回答 2

1

您可以存储上一页和当前 servletContext 的会话属性。每当有新请求时,从会话中获取当前 servletContext 并将其设置为先前的上下文,然后将当前 servletContext 替换为新请求的 servletContext。现在,任何时候您想将用户发送到上一个视图,从 session 获取上一个视图并使用response.sendRedirect((String)session.getAttribute("previousPath")). 对我很有用。

于 2013-05-25T20:30:55.300 回答
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/.. )。

于 2013-05-25T19:33:33.253 回答