防止注销后的返回操作
Posted
技术标签:
【中文标题】防止注销后的返回操作【英文标题】:Prevent the back action after logout 【发布时间】:2011-05-14 21:47:00 【问题描述】:如果我在浏览器中按后退按钮注销后,它不应该显示上一页,它必须转到默认页面(仅限登录页面)。
所以我尝试了很多方法(ruby on rails 应用程序),例如“history.forward()”、“onbeforeunload”、元标记中的过期缓存、“http://www.***ebryan.com/ 后退按钮检测”这么多..我很困惑。
谁能提出解决方案?
【问题讨论】:
如果您将“ruby-on-rails”标签添加到您的问题中,您将更有可能找到答案。 您是否在您的应用程序中使用sessions
,如果是,请检查每个安全页面的session
..
您提供的信息不足以帮助您...我同意 FosterZ,如果您使用 sessions
,请在执行之前检查所有受保护操作中的用户会话,或者使用before_filter :method_name
作为控制器的第一行
另外,如果可以请发布您的方法的代码,在按下后退按钮后呈现会有所帮助..
【参考方案1】:
你不能这样做是有充分理由的。如果可以禁用后退按钮,那么恶意网站都会这样做以阻止您逃脱。无论如何,禁止用户使用基本功能绝不是一个好主意。
话虽如此,您可以不鼓励使用后退按钮。如果您让注销按钮发布表单,然后直接响应 POST(而不是重定向),那么用户将看到来自浏览器的警告,询问他们是否要重新发布表单。
我想另一个技巧是让您的页面(您不希望用户能够返回的页面)在加载到服务器时发出 AJAX 请求。如果该子请求的响应表明用户不再登录,那么您的 javascript 可能会将用户反弹到另一个页面。
说实话,这一切在我看来都是浪费时间。
【讨论】:
【参考方案2】:最好的方法不是控制浏览器,而是控制应用程序的行为。
在你的控制器中,输入:
before_filter :validate_user
并在您的 validate_user 方法中,确定您是否有登录用户(您没有提供足够的详细信息来查看此代码)。如果没有登录用户,将他们重定向到登录页面。
这是一个很常见的成语;我总是能看到它。您可能需要检查一些 Rails 应用程序的来源。这是问题跟踪器 Redmine 的 application_controller。它包含一个名为 user_setup 的 before_filter,它会导致 find_current_user 方法,该方法将从会话中找到一个 User 对象,或者尝试以几种方式验证用户。
【讨论】:
这不考虑浏览器缓存。我假设他想避免在没有向服务器请求的情况下看到前一页。 然后,除了上面的之外,添加一个Cache-Control: no-cache
header。【参考方案3】:
您需要做的是禁用浏览器缓存,以便在您从页面注销后它不会返回缓存的页面。您可以通过设置响应头来避免在应用程序控制器中缓存来做到这一点。怎么样?
in 'application_controller.rb' .....
before_filter :set_no_cache
def set_no_cache
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
end
正如这个答案中提到的:https://***.com/a/748646
【讨论】:
以上是关于防止注销后的返回操作的主要内容,如果未能解决你的问题,请参考以下文章
通过在 L5 中点击浏览器上的后退按钮来防止注销后再次登录?