thinkphp 跨域 代理请求 token

thinkphp 中间件跨域
thinkphp 解决代理问题
在app目录下的middleware文件中
开启全局开局允许中间件
\think\middleware\AllowCrossDomain::class
原来这么简单 我自己弄vue 弄了一下午 狗贼 呀 不要跑

php 原生 响应头 跨域

$web = request()->header(‘Origin’);
//跨域请求设置
header(“Access-Control-Request-Method:GET,POST);
header(“Access-Control-Allow-Credentials:true);
header(“Access-Control-Allow-Origin:.$web);
header(“Access-Control-Allow-Headers:token,Content-Type, Authorization, Accept, Range, Origin,Token,Lang,lang”);
if($this->request->isOptions()){
exit;
}

php中发送https请求时 会出现curl未开启ssl安全问题
将其换成http普通请求就好

今天遇到一个跨域问题记录学习下:

一、问题:

跨域请求中包含自定义header字段时,浏览器console报错。

Request header field xfilesize is not allowed by Access-Control-Allow-Headers

二、原因:

包含自定义header字段的跨域请求,浏览器会先向服务器发送OPTIONS请求,探测该服务器是否允许自定义的跨域字段。

如果允许,则继续实际的POST/GET正常请求,否则,返回标题所示错误。

所以需要在你服务端的Access-Control-Allow-Headers中设置你自定义的请求头内容

示例 thinkphp6中

//使用全局开局中间件
\think\middleware\AllowCrossDomain::class

在 AllowCrossDomain中修改

关于token处理

后端方面 全局路由中间件 只负责处理token是否是对的 不负责做别的
生成token只在login中生成

thinkphp中 中间件使用$request得到的controller名字都为 小写 切记是小写的 所以判断的时候一定要非常小心的注意

### ThinkPHP 框架携带 Token 进行请求的解决方案 为了使 ThinkPHP 支持带有 `token` 的请求,可以采用多种方法配置资源共享 (CORS),并确保自定义头部字段如 `token` 被服务器端接受。 #### 方法一:通过中间件实现全局支持 在应用根目录下找到 `app/middleware/AllowCrossDomain.php` 文件创建或编辑该文件以添加如下代码: ```php <?php namespace app\middleware; use Closure; use think\Request; class AllowCrossDomain { public function handle(Request $request, Closure $next){ header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); header("Access-Control-Max-Age: 1728000"); header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, token"); if ($request->isOptions()){ exit(); } return $next($request); } } ``` 接着,在入口文件或者框架默认加载的地方注册此中间件[^2]。 #### 方法二:路由级别设置允许访问 对于特定API路径可以直接在其对应的路由规则后面追加 `.allowCrossDomain()` 来开启针对单一路由的权限。例如: ```php Route::post('api/v1/user/login', 'UserController@login')->allowCrossDomain([ 'origin'=>['*'], 'headers'=>['Content-Type','Authorization','Accept','X-Request-ID','Token'], // 自定义需要放行的Header列表 'methods'=>['GET','POST'] ]); ``` 这种方法适用于只需要部分接口开放的情况[^3]。 #### 方法三:HTTP响应头手动处理 如果不想依赖于上述两种方式,则可以在控制器内部直接操作 HTTP 头部信息来完成同样的功能。比如在一个登录验证函数里加入下面几行代码即可满足需求: ```php public function login(){ ... // 手动设置相关Http Header header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Credentials:true'); header('Access-Control-Allow-Headers:x-requested-with,content-type,token'); echo json_encode(['status'=>true,'message'=>'success']); } ``` 以上三种办法都可以有效解决带 `token` 参数的问题,具体选择哪一种取决于实际应用场景和个人偏好[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值