注销后阻止用户查看以前访问过的安全页面

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)

这个地图Filterurl-pattern的兴趣,例如*.jsp.

@WebFilter("*.jsp")
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想将此限制放在安全页面上,那么您应该指定一个覆盖所有这些安全页面的URL模式.例如,当它们都在文件夹中时/app,则需要指定URL模式/app/*.

@WebFilter("/app/*")
Run Code Online (Sandbox Code Playgroud)

更重要的是,您可以Filter像检查已登录用户的位置一样执行此任务.

在测试之前不要忘记清除浏览器缓存!;)

也可以看看:

  • @Bozho:您提供了一组不完整的标题,或者浏览器的页面仍在其缓存中. (3认同)
  • 有时这还不够,我记得有这样的问题.浏览器只记得最后一页.但它可能是IE6,我不记得:) (2认同)

小智 5

转发页面时,Url Pattern中的*.jsp将无效.尝试包括你的servlet ..这将使你的应用程序安全,从这个后退按钮问题.