关于session的一个现象

路由中:
Route::group(array('before'=>'alonevisit'),  function (){
Route::get('A',...)
});

过滤器中:
Route::filter('alonevisit', function() {
if (Session::has('isaccess')) {
$guan = Session::get('isaccess', 'noaccess');
if ($guan == 'noaccess') {
return Response::make("对不起页面没找到!", 404);
} else {
Session::put('isaccess', 'noaccess');
}
} else {
return Response::make("对不起页面没找到!", 404);
}
});

在一个页面中每次请求路由A之前先执行:
Session::set('isaccess','haveaccess');
然后请求路由A。

注意这是一个页面中多次请求路由A,而不是在地址栏中多次请求路由A。

第一次路由A的结果是$guan=haveaccess,这正常没问题。
第二次,第三次,以后的请求中$guan=noaccess。这我就感觉好奇了,难道Session中的isaccess是局部变量?这也不应该啊,因为第一次请求时正常的。为啥后面就因为执行了filter中的
Session::put('isaccess', 'noaccess');
就是一直是noaccess?想不通啊。
已邀请:

00幽靈00 - 略知一二,不求甚解

赞同来自: xsmyqf

在一个页面中每次请求路由A之前先执行:
Session::set('isaccess','haveaccess');
然后请求路由A。
这时候 session 中的 isaccess 值是 haveaccess
$guan = Session::get('isaccess', 'noaccess');
这时候 $guan 的值是从session中取出来的,所以也是 haveaccess
然后你这里的if判断,因为 $guan 的值是 haveaccess ,所以执行else部分
Session::put('isaccess', 'noaccess');
这时你将session中的 isaccess 设置为 noaccess

所以从第二次开始
$guan = Session::get('isaccess', 'noaccess');
执行之后,$guan 的值是从session中取出来的 noaccess
并且在if中没有再次设置session中的值,此后 $guan 的值一直都是 noaccess

LZ想通了吗?

FiveSay - 成武

赞同来自: xsmyqf

1、一个请求对应一个路由,不存在一个请求访问多个路由的情况。唯一有可能的就是:一个页面通过异步发起多次请求,然而这样对于路由来说与地址栏收入无异。
2、session 不是变量,这是基础,当其值被改变时将一直保持,直到再次被赋值或者销毁。

FiveSay - 成武

赞同来自: xsmyqf

@xsmyqf: 我做了一个最小化测试,并没有出现你所描述的现象。
Route::filter('alonevisit', function() {
    if (Session::has('isaccess')) {
        $guan = Session::get('isaccess', 'noaccess');
        echo '<p>$guan = "'.$guan.'";</p>';
        if ($guan == 'noaccess') {
            return Response::make('对不起页面没找到!', 404);
        } else {
            Session::put('isaccess', 'noaccess');
        }
    } else {
        return Response::make('对不起页面没找到!', 404);
    }
});

Session::set('isaccess','haveaccess');

Route::group(array('before'=>'alonevisit'),  function (){
    Route::get('test', function () {
        echo 'this is test route.';
    });
});

FiveSay - 成武

赞同来自:

你的代码我看了,最根本的错误在这里:
mx3E138.png

虽然你每次请求 iframe 页面时都要执行一次这个 javascript 函数,但里面那段 php 脚本根本就不可能被执行到!因为这个 php 脚本所在的父页面根本就没有被刷新,服务端就不会再次解析和执行这段 php 代码!
这是很基础的东西了,这要是我带出来的,一定会被我一脚踹到老远,真的。

要回复问题请先登录注册