为啥在laravel中按下浏览器的后退按钮时过滤器不起作用?

Posted

技术标签:

【中文标题】为啥在laravel中按下浏览器的后退按钮时过滤器不起作用?【英文标题】:Why the filter does not work when the back button of the browser is pressed in laravel?为什么在laravel中按下浏览器的后退按钮时过滤器不起作用? 【发布时间】:2014-07-17 22:34:57 【问题描述】:

我有一个视图输入一个帐户,然后调用控制器验证数据,然后使用身份验证方法保存

    public function doLogin()
    $rules = array(
                    'email' => 'required|email',
                    'password' => 'required'
                    );

    $validator = Validator::make(Input::all(), $rules);
    //dd(Input::all());

    if($validator->fails())
        return Redirect::to('usuarios')->withErrors($validator)->withInput(Input::except('password'));
    else

        $userdata = array(
            'email' => Input::get('email'),
            'password' => Input::get('password')
            );

        if(Auth::attempt($userdata))
            return View::make('principal');
        else

            return Redirect::to('usuarios');
        

    

我还有退出会话的功能

Route::get('usuarios/logout', function()
        Auth::logout();
        return Redirect::to('usuarios'); //login page
)->before('auth');

问题是当我按下浏览器的后退按钮时,我可以毫无问题地使用应用程序但无需身份验证。

路线

Route::get('usuarios', function()
return View::make('login');
)->before('guest');

Route::get('usuarios/view', function()
    $usuarios = Usuario::paginate(5);
    return View::make('viewusuario', array('usuarios' => $usuarios));
)->before('auth');

Route::get('usuario/create', function()
    return View::make('formusuario');
)->before('auth');

过滤器

Route::filter('auth', function()

    if (Auth::guest()) return Redirect::guest('usuarios'); //login page
);
Route::filter('guest', function()

    if (Auth::check())
        return View::make('principal'); //home page     
    
);

我该如何解决?

【问题讨论】:

因为它是浏览器缓存 - 它不会“重新加载”您的页面。 你的意思是看到? 用户将看到而不是使用,但将无法做任何事情...... @zhelon 人们说这是缓存,点击后退按钮可能是真的,但我想我可以问的问题是:注销然后回击,然后您可以像登录一样使用该应用程序吗?因此,不仅可以像登录一样看到上一个屏幕,还可以看到该页面的实际操作,或者一旦您执行操作,它会要求您登录吗? 【参考方案1】:

问题与浏览器缓存有关,与 Laravel 无关。

要处理浏览器缓存,您可以在您的启动文件之一或服务提供者中使用以下代码:

App::after(function($request, $response)

    $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate');
    $response->headers->set('Pragma','no-cache');
    $response->headers->set('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
);

这里我们只是使用 application events 修改 Laravel 中的每个响应。


有人说这适用于所有网络浏览器,但不适用于 IE。所以对于 IE,你应该在你的布局中添加一堆元标记:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="no-store" />
<meta http-equiv="cache-control" content="must-revalidate" />
<meta http-equiv="expires"       content="0" />
<meta http-equiv="expires"       content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma"        content="no-cache" />

【讨论】:

我必须把这个 conde 放在app/config/app.php 中? 在几个 IE 版本上测试过,它总是能正常工作。在我的示例中,我只使用了前两个标题(Cache-controlPragma)并且没有设置任何元标记。 @zhelon - App::after(…) 事件在“filters.php”文件中定义。 非常感谢,这个作品非常好。我打开了赏金,因为我不明白你的代码,我问过你,但没有回应:D 这会导致在 chrome 中加载页面之间出现白色闪烁。也许对此有任何建议?【参考方案2】:

问题在于浏览器缓存,当您返回时,浏览器不会查询所有内容,为了速度它只是从缓存中加载页面。但是,当您重新加载该页面ctrl + r 时,它将无法正常工作。您可以像其他人在此处所说的那样禁用页面缓存,但如果您使用云托管,则会降低网站性能和更多费用。所以缓存很好,留着吧。

您应该尝试将所有需要auth 过滤器的页面分组,这样您就不会忘记添加该过滤器,我们都是人类,有时我们会忘记。

Route::group(['before' => 'auth', function()
    Route::get('usarios/view', function()  ... );
    Route::get('usarios/create', function()  ... );
]);

Route::group(['before' => 'guest', function()
    Route::get('usarios/login', 'AuthController@showLogin');
    Route::post('usarios/login', 'AuthController@doLogin');
]);

另外,尽量不要在登录post 中显示主用户页面,在您的情况下为doLogin。您应该将用户重定向到显示用户主页的新页面。

【讨论】:

以上是关于为啥在laravel中按下浏览器的后退按钮时过滤器不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器中按下后退/前进按钮时,有没有办法在重新渲染之前改变行为

为啥在c#,mvc中退出并按下浏览器后退按钮时会转到一个页面

在iOS中按下后退按钮时如何创建确认弹出窗口?

在父活动上按下后退按钮

在导航栏中按下后退按钮时刷新 RootViewController 的内容

在android中按下后退按钮后如何返回相同的选项卡?