在历史记录中替换或删除页面

时间:2012-04-05 08:20:59

标签: java jsf java-ee netbeans

我正在开发一个具有登录功能的应用程序,在用户登录后我想从历史记录中删除登录页面,这样如果他们选择后退按钮(登录后),它将不会返回到登录页面,但是它之前的那个。

在javascript中代码是location.replace('whatever_url_you_are_forwarding_to');我想知道Java / JSF中的等价物

2 个答案:

答案 0 :(得分:0)

服务器端Java代码无法修改客户端浏览器的历史记录。 我不会弄乱浏览器历史记录:用户期望后退按钮具有一致且可预测的行为。如果他们想要返回登录页面,请让他们返回登录页面。

答案 1 :(得分:0)

您可以通过以下方式解决此问题:

  • 告诉浏览器不要缓存登录页面,以便它始终在其上发送一个完整的GET请求,而不是从浏览器缓存中加载。

  • 当用户已登录时请求登录页面,然后将重定向发送到所需页面(当用户登录时,您已在会话中记住该页面。)

    < / LI>

这可以在同一个filter中完成(虽然我个人更喜欢在所有对变更敏感的动态页面上禁用浏览器缓存,因此可以在更通用的URL模式的另一个过滤器中完成覆盖那些页面。)

这是一个启动示例,假设您正在使用容器管理的身份验证(对于本地身份验证,其中您手动将用户置于会话中,只需检查是否存在会话属性):

@WebFilter("/login.xhtml")
public class LoginPageFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession();

        // Tell browser to not cache this page.
        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); // Proxies.

        // Check if user is logged in.
        if (request.getRemoteUser() == null) {
            // Not logged in, so remember previous URL and continue request.
            session.setAttribute("referrer", request.getHeader("referer")); // Yes, the misspelling is "correct"!
            chain.doFilter(request, response);
        } 
        else {
            // Logged in, so redirect to initial referring URL, if any.
            String referrer = (String) session.getAttribute("referrer");

            if (referrer != null) {
                response.sendRedirect(referrer);
            }
            else {
                // There was no referring page. Just continue request?
                chain.doFilter(request, response);
            }
        }
    }

    // ...
}