Laravel cookie自带加密,为什么?
Laravel cookies comes with encryption, why?
我得到了以下服务提供商:
class CartServiceProvider extends ServiceProvider {
public function boot() {
}
public function register() {
$this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) {
return new \Alexxosipov\Cart\Cart($app['request']);
});
}
}
还有我的购物车 class,我从哪里得到的:
$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;
但是request()->cookie('cart_id')
returns加密字符串。如果我在任何控制器中执行此操作,它都可以正常工作。为什么?我应该怎么做才能在购物车中使用它 class?Laravel 5.5
为什么? Cookie 加密保护存储在客户端浏览器中的数据。
如何: Laravel 使用 EncryptCookies 中间件,此中间件在您的服务提供商注册时尚未处理,但会为控制器处理,因为中间件在请求传递给控制器之前在路由堆栈中。
由于我不了解您的购物车 class 及其逻辑,因此我无法真正推荐您应该做什么。也许您需要考虑何时将 Request 对象传递给 class.
Laravel 引导请求的顺序是这样的 (v5.6): (CMIIW)
index.php
被称为
\Illuminate\Foundation\Application
创建
HttpKernel
已注册。这会注册您的中间件
Console Kernel
已注册。这定义了控制台命令
Exception Handler
已注册。这定义了异常处理程序
HttpKernel
已实例化。这会实例化所有中间件,加上 boot/register 所有服务提供商
- 创建全局
request
实例。将其传递给 HttpKernel
以处理传入请求。
- 中间件
EncryptCookies
调用,cookie 解密
- 发送
request
给其他中间件处理
- 发送
request
到路由器,路由器发送到控制器
- ...
- 在向浏览器发送响应之前,在
EncryptCookies
中 cookie 加密回
Cookie 在第 1 步 - 第 7 步中保持加密状态。您的 CartServiceProvider
正在尝试获取尚未在第 6 步解密的 cookie,这是不可能的。考虑
自己解密cookie(仅使用decrypt
),或者
在EncryptCookies
之后制作一个中间件来实例化购物车。在引导服务提供者阶段实例化购物车有点为时过早。
编辑:添加单例建议
我认为你可以这样做:
在您的 Cart::class
中创建一个名为 loadCartFromRequest($request)
的新方法。此方法可帮助您在中间件阶段从请求中加载购物车实例。
在你的CartServiceProvider
中,你像往常一样注册了一个Cart::class
的单例,但不需要在这里阅读请求。
创建一个名为 CartMiddleware
的中间件。这个中间件调用 app(Cart::class)->loadCartFromRequest($request)
.
然后在您需要购物车实例的任何其他地方,您可以从 app(Cart::class)
.
访问您的购物车模型
希望我能正确理解您的要求:)
我得到了以下服务提供商:
class CartServiceProvider extends ServiceProvider {
public function boot() {
}
public function register() {
$this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) {
return new \Alexxosipov\Cart\Cart($app['request']);
});
}
}
还有我的购物车 class,我从哪里得到的:
$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;
但是request()->cookie('cart_id')
returns加密字符串。如果我在任何控制器中执行此操作,它都可以正常工作。为什么?我应该怎么做才能在购物车中使用它 class?Laravel 5.5
为什么? Cookie 加密保护存储在客户端浏览器中的数据。
如何: Laravel 使用 EncryptCookies 中间件,此中间件在您的服务提供商注册时尚未处理,但会为控制器处理,因为中间件在请求传递给控制器之前在路由堆栈中。
由于我不了解您的购物车 class 及其逻辑,因此我无法真正推荐您应该做什么。也许您需要考虑何时将 Request 对象传递给 class.
Laravel 引导请求的顺序是这样的 (v5.6): (CMIIW)
index.php
被称为\Illuminate\Foundation\Application
创建HttpKernel
已注册。这会注册您的中间件Console Kernel
已注册。这定义了控制台命令Exception Handler
已注册。这定义了异常处理程序HttpKernel
已实例化。这会实例化所有中间件,加上 boot/register 所有服务提供商- 创建全局
request
实例。将其传递给HttpKernel
以处理传入请求。 - 中间件
EncryptCookies
调用,cookie 解密 - 发送
request
给其他中间件处理 - 发送
request
到路由器,路由器发送到控制器 - ...
- 在向浏览器发送响应之前,在
EncryptCookies
中 cookie 加密回
Cookie 在第 1 步 - 第 7 步中保持加密状态。您的 CartServiceProvider
正在尝试获取尚未在第 6 步解密的 cookie,这是不可能的。考虑
自己解密cookie(仅使用
decrypt
),或者在
EncryptCookies
之后制作一个中间件来实例化购物车。在引导服务提供者阶段实例化购物车有点为时过早。
编辑:添加单例建议
我认为你可以这样做:
在您的
Cart::class
中创建一个名为loadCartFromRequest($request)
的新方法。此方法可帮助您在中间件阶段从请求中加载购物车实例。在你的
CartServiceProvider
中,你像往常一样注册了一个Cart::class
的单例,但不需要在这里阅读请求。创建一个名为
CartMiddleware
的中间件。这个中间件调用app(Cart::class)->loadCartFromRequest($request)
.然后在您需要购物车实例的任何其他地方,您可以从
app(Cart::class)
. 访问您的购物车模型
希望我能正确理解您的要求:)