我正在开发一个具有登录功能的应用程序,在用户登录后我想从历史记录中删除登录页面,这样如果他们选择后退按钮(登录后),它将不会返回到登录页面,但是它之前的那个。
在javascript中代码是location.replace('whatever_url_you_are_forwarding_to');
我想知道Java / JSF中的等价物
答案 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);
}
}
}
// ...
}