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

将该代码复制过去放到项目或相应的中间件组中即可

(3),如果你从route服务里面创建的路由文件

可以直接通过在编写相关方法,在跳转前直接加入web中间件组

protected function mapXXRoutes()
{
    Route::middleware('web')
       ->namespace($this->xxx)
       ->group(base_path('routes/xxx.php'));
}

2,session使用失效(中间件,controller方法里)

原因主要有以下几点:

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

(2)larvel为了防止不断的加载更新session相关信息到文件或数据库中,当运行put方法后并没有立马将内容存储到文件或者数据库中,而是存储在缓存,当全部页面或者方法加载完成后,再将缓存文件中的session保存到相关的文件或数据库中。 如果页面没有加载完或者错误使用dd(),die(),exit()等方法直接终止操作的化,会造成session没有保存到文件或数据库中,下次使用将无法获取里面的数据。

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

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

(3) 路由分组不合理,为了让同一个项目可以给不同模块使用,而相互直接不影响,laravel将不同分组的下的session的token 默认变为的不同,导致你加载其他模块地址的时候session_id不统一,从而获取不到值

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

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

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

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

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

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值