注销后如何防止浏览器的后退按钮登录

Posted

技术标签:

【中文标题】注销后如何防止浏览器的后退按钮登录【英文标题】:How I Prevent Browser's Back Button Login After Logout 【发布时间】:2015-09-28 19:42:48 【问题描述】:

我的问题是我可以在点击注销链接后正确注销,但是如果我点击浏览器的后退按钮,仍然能够看到页面的内容,这实际上不应该被我的身份验证中间件进程看到。 我读到我可以通过禁用缓存来防止这种情况,但不认为这是最好的方法,所以我怎样才能以更好的方式做到这一点?我的注销功能是

public function logout()

    Auth::logout();
    Session::flush();
    return redirect('login');

我的路线是:

Route::get('logout','Homecontroller@logout');

提前感谢

【问题讨论】:

其实你看到的都是缓存的,用后退键尝试刷新页面,你会被重定向。 是的但是,当点击后退按钮时可以看到一些重要的数据,所以我必须防止这种情况。不过感谢您的建议。 我认为没有合适的方法来做到这一点,因为这是客户端问题。或者这就是我从你的问题中理解的 Prevent Browser's Back Button Login After Logout in Laravel 5的可能重复 【参考方案1】:

假设您已经完成了内核和中间件

在您的 Controller 上,创建一个构造函数,然后添加中间件身份验证

public function __construct()

    $this->middleware('auth');

我希望这对你有用

【讨论】:

【参考方案2】:

使用 artisan 创建中间件

php artisan make:middleware RevalidateBackHistory

在 RevalidateBackHistory 中间件中,我们将标头设置为 no-cache 并重新验证

<?php
namespace App\Http\Middleware;
use Closure;
class RevalidateBackHistory

    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    
        $response = $next($request);
        return $response->header('Cache-Control','nocache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
    

在 Kernel.php 中更新应用的路由中间件

protected $routeMiddleware = [
    .
    .
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    .
    .
];

仅此而已!所以基本上你只需要为需要用户身份验证的路由调用 revalidate 中间件。

【讨论】:

【参考方案3】:

这个 javascript 代码对我有用:

<script>
    // previous page should be reloaded when user navigate through browser navigation
    // for mozilla
    window.onunload = function();
    // for chrome
    if (window.performance && window.performance.navigation.type === window.performance.navigation.TYPE_BACK_FORWARD) 
        location.reload();
    
</script>

在 Chrome 版本 80.0.3987.122(官方版本)(64 位)和 火狐 73.0.1(64 位)

【讨论】:

【参考方案4】:

添加这段 javascript 代码,它将阻止重定向。

history.pushState(null, null, document.URL);
window.addEventListener('popstate', function () 
    history.pushState(null, null, document.URL);
);

【讨论】:

【参考方案5】:

在您的页面顶部使用一个简单的 AJAX 请求(类似于 ping 服务),将缓存设置为 false 并在其中放置一些子句,以便在未通过身份验证的情况下将访问者重定向到登录。

因此,注销后,如果您尝试返回,即使主页已被浏览器缓存,它仍会尝试在页面加载时重新加载 AJAX 请求。由于用户身份验证不再有效,它会将用户重定向回登录页面。

【讨论】:

【参考方案6】:

这个问题出在浏览器上。浏览器缓存页面内容,并在您点击返回按钮时将缓存的内容提供给用户。

在需要用户登录的页面上设置缓存控制元标记。这样你就告诉浏览器不要缓存它。

例如:

<meta http-equiv="cache-control" content="private, max-age=0, no-cache">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">

【讨论】:

这个解决方案似乎不起作用,浏览器后退按钮仍然移动到仪表板页面而不是登录页面:( 将这些放在响应的标题中对我有用。

以上是关于注销后如何防止浏览器的后退按钮登录的主要内容,如果未能解决你的问题,请参考以下文章

如何防止laravel 5.2中的浏览器后退按钮

防止注销后的返回操作

servlet会话,注销后,按下浏览器的后退按钮时,再次显示安全页面[重复]

Codeigniter 按下注销按钮并禁用后退浏览器按钮

使用浏览器后退按钮进行 ASP.NET 身份验证登录和注销

在 Grails 中注销后,浏览器后退按钮显示上一页