我目前正在开发一个具有登录名的应用程序,在此人登录后,我想从历史记录中删除登录页面,这样如果他们选择后退按钮(登录后),它就不会返回登录页面,而是之前的那个它。
在javascript中,代码是location.replace('whatever_url_you_are_forwarding_to');
我想知道Java / JSF中的等价物
我目前正在开发一个具有登录名的应用程序,在此人登录后,我想从历史记录中删除登录页面,这样如果他们选择后退按钮(登录后),它就不会返回登录页面,而是之前的那个它。
在javascript中,代码是location.replace('whatever_url_you_are_forwarding_to');
我想知道Java / JSF中的等价物
您可以通过以下方式解决此问题:
告诉浏览器不要缓存登录页面,这样它就会始终在其上发送一个完整的 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);
}
}
}
// ...
}
服务器端 Java 代码无法修改客户端浏览器的历史记录。我不会弄乱浏览器历史记录:用户期望后退按钮具有一致且可预测的行为。如果他们想回到登录页面,让他们回到登录页面。