Answers:
您可以也不应禁用浏览器的后退按钮或历史记录。这对用户体验不利。有JavaScript hack,但是它们不可靠,并且在客户端禁用JS时也无法使用。
您的具体问题是请求的页面是从浏览器缓存中加载的,而不是直接从服务器中加载的。这本质上是无害的,但确实会使最终用户感到困惑,因为他/他错误地认为它确实来自服务器。
您只需要指示浏览器不要缓存所有受限的JSP页面(因此,不仅是注销页面/动作本身!)。这样,浏览器被迫从服务器而不是从缓存请求页面,因此将执行服务器上的所有登录检查。您可以使用过滤器执行此操作,该过滤器在方法中设置必要的响应标头doFilter()
:
@WebFilter
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
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.
chain.doFilter(req, res);
}
// ...
}
这个地图Filter
上url-pattern
的兴趣,例如*.jsp
。
@WebFilter("*.jsp")
或者,如果您只想对受保护页面设置此限制,则应指定一个涵盖所有受保护页面的URL模式。例如,当它们全部位于文件夹中时/app
,则需要指定的URL模式/app/*
。
@WebFilter("/app/*")
甚至,您可以与Filter
检查已登录用户的状态相同地执行此工作。
测试前不要忘记清除浏览器缓存!;)
doFilter()
方法。当我按下注销按钮时,它将被重定向到一个servlet,在该servlet中我使会话无效。我不确定该doFilter()
方法在这里如何发挥作用。你能告诉我如何实现吗?如图所示,遵循正确的步骤。谢谢。
sendRedirect(...)
和之后都经过测试forward()
。
在不禁用浏览器后退按钮的情况下,最简单的方法是将以下代码添加到page_load
您不希望用户注销后返回的页面的事件中:
if (!IsPostBack)
{
if (Session["userId"] == null)
{
Response.Redirect("Login.aspx");
}
else
{
Response.ClearHeaders();
Response.ClearContent();
Response.Clear();
Session.Abandon();
Session.Remove("\\w+");
Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
Response.AddHeader("Pragma", "no-cache");
Response.AddHeader("Expires", "0");
}
}