我有一个要求,即最终用户不应该能够返回到受限制的网页后注销/注销。但目前,最终用户可以通过浏览器后退按钮、访问浏览器历史记录,甚至在浏览器地址栏中重新输入url来实现这一点。基本上,我希望最终用户不应该能够访问任何方式后,注销限制页。我怎样才能做到最好?我可以用javascript禁用back按钮吗?
uqdfh47h1#
您可以尝试告诉浏览器不要缓存主页(使用适当的标题-expires、cache control、pragma)。但这并不能保证有效。您可以做的是,在页面加载时对服务器进行ajax调用,以检查用户是否已登录,如果未登录,则进行重定向。
fnvucqvd2#
您可以也不应该禁用浏览器后退按钮或历史记录。这不利于用户体验。有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); } // ... }
绘制此Map Filter 在 url-pattern 比如说有兴趣的 *.jsp .
Filter
url-pattern
*.jsp
@WebFilter("*.jsp")
或者,如果您只想将此限制放在安全页面上,那么您应该指定一个覆盖所有这些安全页面的url模式。例如,当它们都在文件夹中时 /app ,则需要指定 /app/* .
/app
/app/*
@WebFilter("/app/*")
更重要的是,你可以用同样的方法做这项工作 Filter 作为检查登录用户是否存在的位置。测试前不要忘记清除浏览器缓存!;)
用于登录的身份验证过滤器和servlet如何在所有浏览器中控制网页缓存?
v1l68za43#
不禁用浏览器back buton的最简单方法是将此代码添加到 page_load 您不希望用户在注销后返回的页面的事件:
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"); } }
kxeu7u2r4#
正确的方法是添加
Vary: Cookie
安全页面上的标题。当用户注销时,清除他们的会话cookie。然后,当他们注销后返回时,浏览器缓存将丢失。这还有一个好处,就是不会完全破坏缓存。
falq053o5#
5条答案
按热度按时间uqdfh47h1#
您可以尝试告诉浏览器不要缓存主页(使用适当的标题-expires、cache control、pragma)。但这并不能保证有效。您可以做的是,在页面加载时对服务器进行ajax调用,以检查用户是否已登录,如果未登录,则进行重定向。
fnvucqvd2#
您可以也不应该禁用浏览器后退按钮或历史记录。这不利于用户体验。有javascript黑客,但他们是不可靠的,也不会工作时,客户端已禁用js。
具体的问题是请求的页面是从浏览器缓存加载的,而不是直接从服务器加载的。这基本上是无害的,但确实会让最终用户感到困惑,因为他/她错误地认为它确实来自服务器。
您只需要指示浏览器不要缓存所有受限制的jsp页面(因此不仅仅是注销页面/操作本身!)。这样,浏览器被迫从服务器而不是从缓存请求页面,因此将执行服务器上的所有登录检查。您可以使用过滤器来实现这一点,该过滤器在
doFilter()
方法:绘制此Map
Filter
在url-pattern
比如说有兴趣的*.jsp
.或者,如果您只想将此限制放在安全页面上,那么您应该指定一个覆盖所有这些安全页面的url模式。例如,当它们都在文件夹中时
/app
,则需要指定/app/*
.更重要的是,你可以用同样的方法做这项工作
Filter
作为检查登录用户是否存在的位置。测试前不要忘记清除浏览器缓存!;)
另请参见:
用于登录的身份验证过滤器和servlet
如何在所有浏览器中控制网页缓存?
v1l68za43#
不禁用浏览器back buton的最简单方法是将此代码添加到
page_load
您不希望用户在注销后返回的页面的事件:kxeu7u2r4#
正确的方法是添加
安全页面上的标题。当用户注销时,清除他们的会话cookie。然后,当他们注销后返回时,浏览器缓存将丢失。这还有一个好处,就是不会完全破坏缓存。
falq053o5#