0

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

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

4

2 回答 2

0

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

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

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

这可以在一个相同的过滤器中完成(尽管我个人更喜欢在所有对变化敏感的动态页面上禁用浏览器缓存,这样就可以在另一个过滤器中使用覆盖这些页面的更通用的 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);
            }
        }
    }

    // ...
}
于 2012-04-05T14:05:59.453 回答
0

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

于 2012-04-05T09:57:18.467 回答