我要求最终用户注销/退出后不能返回受限页面。但是目前,最终用户可以通过浏览器后退按钮,访问浏览器历史记录或什至通过在浏览器地址栏中重新输入URL来执行此操作。
基本上,我希望最终用户退出后不能以任何方式访问受限页面。我怎样才能做到最好?我可以使用JavaScript禁用后退按钮吗?
您 可以也不应 禁用浏览器的后退按钮或历史记录。这对用户体验不利。有一些JavaScript技巧,但是它们不可靠,并且在客户端禁用JS时也无法使用。
您的具体问题是请求的页面是从浏览器缓存中加载的,而不是直接从服务器中加载的。这本质上是无害的,但确实会使最终用户感到困惑,因为他/他错误地认为它确实来自服务器。
您只需要指示浏览器 不要 缓存 所有 受限制的JSP页面(因此不仅缓存注销页面/动作本身!)。这样,浏览器被迫从服务器而不是从缓存请求页面,因此将执行服务器上的所有登录检查。您可以使用过滤器来执行此操作,该过滤器可在方法中设置必要的响应标头doFilter():
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。
Filter
url-pattern
*.jsp
@WebFilter("*.jsp")
或者,如果您只想对受保护页面设置此限制,则应指定一个涵盖所有受保护页面的URL模式。例如,当它们全部位于文件夹中时/app,则需要指定的URL模式/app/*。
/app
/app/*
@WebFilter("/app/*")
甚至,您可以与Filter检查已登录用户的状态相同地执行此工作。
测试前不要忘记清除浏览器缓存!;)