raa*_*aaz 99 jsp servlets back-button logout browser-history
我要求最终用户在注销/注销后不能返回受限页面.但目前最终用户可以通过浏览器后退按钮,访问浏览器历史记录或甚至通过在浏览器的地址栏中重新输入URL来实现.
基本上,我希望最终用户在注销后不能以任何方式访问受限制的页面.我怎样才能做到最好?我可以用JavaScript禁用后退按钮吗?
Bal*_*usC 137
您可以而且不应该禁用浏览器后退按钮或历史记录.这对用户体验不利.有JavaScript攻击,但它们不可靠,当客户端禁用JS时也无法运行.
您的具体问题是所请求的页面是从浏览器缓存加载而不是直接从服务器加载.这基本上是无害的,但确实让最终用户感到困惑,因为他/她错误地认为它确实来自服务器.
您只需要指示浏览器不要缓存所有受限制的JSP页面(因此不仅仅是注销页面/操作本身!).这样,浏览器被迫从服务器而不是从缓存请求页面,因此将执行服务器上的所有登录检查.您可以使用Filter在方法中设置必要的响应头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);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这个地图Filter
上url-pattern
的兴趣,例如*.jsp
.
@WebFilter("*.jsp")
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想将此限制放在安全页面上,那么您应该指定一个覆盖所有这些安全页面的URL模式.例如,当它们都在文件夹中时/app
,则需要指定URL模式/app/*
.
@WebFilter("/app/*")
Run Code Online (Sandbox Code Playgroud)
更重要的是,您可以Filter
像检查已登录用户的位置一样执行此任务.
在测试之前不要忘记清除浏览器缓存!;)
归档时间: |
|
查看次数: |
64327 次 |
最近记录: |