laravel中的session使用过程中的问题

1,有一个坑叫做session没有开启

laravel的session开启是放在web中间件中的,如果你编写路由的时候忽略到掉使用中间web,就会导致项目时候过程中,尝尝发现自己的session没有保存成功,但是,在项目中Session::put后接着Session::get会发现值是有的等各种情况

这时候可以进行两种方式:

(1):加入web中间件,如果写在其他中间件的话,先把web放到前面如

'middleware' => ['web', 'checkWechat'],

(2),将中间件下面的开启放入到自己的项目或中间件中

在app/Http/Kernel.php文件下的$middlewareGroups 下的web数组中有一个

\Illuminate\Session\Middleware\StartSession::class

将该代码复制过去即可

2,中间件使用session发现失效

原因主要有以下几点:

(1)session没有开启,解决办法同方法如1

(2)larvel为了防止不断的加载更新session,larvel并不是所有的put都立马将内容存储到文件或者数据库中

          一般采用的机制是全部页面加载完,再将页面的session保存到相关的文件或数据库中

          如果页面没有加载完或者其他地方错误使用dd(),die(),exit();都会造成session没有保存到文件或数据库中,下次使用将无法            获取。

       解决办法:1,将dd(),die(),exit()等终止操作更换为return,表示页面已经更新完

                          2,使用Session::put之后使用Session::save()强制保存

(3) 路由分组不合理,为了让同一个项目可以给不同模块使用,而相互直接不影响,laravel将不同分组的下的session的token

          默认变为的不同,导致你加载其他路边地址的时候session不统一,从而获取不到值

        解决办法: 1,将相关路由建立到同一个分组下面                    

Route::get('/', function () {    
//路由放在这里})->middleware('web');
或者
Route::group(['middleware' => ['web']], function () {    
//路由放在这里});

                            2,使用共享机制让所有相关域名下的所有项目共享同一个session

                                  此操作必须使用共同数据库或者redis,更改.env文件即可

SESSION_DOMAIN=.xxx.com //这里自定义自己的域名 注意前面有个. 
将两个项目中APP_KEY 的值改一致 

 

猜你喜欢

转载自blog.csdn.net/gyen_ki/article/details/82956392