ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain

简介: ThinkPHP6.0处理前端请求跨域问题AllowCrossDomain

按照官网给出的例子,在中间件配置允许跨域


app/middleware.php


<?php
// 中间件配置
use think\middleware\AllowCrossDomain;
return [
    AllowCrossDomain::class
];

前端请求依然出现了跨域请求提示


Access to XMLHttpRequest at from origin has been blocked by CORS policy: 
Request header field x-token is not allowed by 
Access-Control-Allow-Headers in preflight response.

原因是我们添加了自定义的请求头X-Token用来携带token,所以需要我们重新改造一下中间件


新建一个自定义的跨域中间件


app/middleware/AllowCrossDomainMiddleware.php


<?php
namespace app\middleware;
use think\middleware\AllowCrossDomain;
class AllowCrossDomainMiddleware extends AllowCrossDomain
{
    // 加入自定义请求头参数 X-Token
    protected $header = [
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Max-Age'           => 1800,
        'Access-Control-Allow-Methods'     => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
        'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token',
    ];
}

重新配置中间件


app/middleware.php

<?php
// 中间件配置
use think\middleware\AllowCrossDomain;
use app\middleware\AllowCrossDomainMiddleware;
return [
    // 不使用默认的跨域中间件
    // AllowCrossDomain::class
    // 使用自定义跨域中间件
    AllowCrossDomainMiddleware::class
];

继续改进

查看请求日志发现,options请求会走一遍处理流程,有些需要权限校验的地方还会因为缺少参数而报错,这样肯定不行。


可以在入口文件添加以下代码,单独处理options请求


public/index.php


// 处理 OPTIONS 请求
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
    header("'Access-Control-Allow-Credentials: true");
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token");
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
    exit; // 直接退出,不走后序流程
}

添加了发现有的接口还是会有跨域问题存在, POST方式漏处理了,再次优化如下


// 添加允许跨域请求头
header("'Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, X-Token");
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
// 处理 OPTIONS 请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    exit;
}
相关文章
|
23天前
|
JavaScript 前端开发 网络协议
前端JS发起的请求能暂停吗?
在讨论前端JS发起的请求是否能暂停时,需要明确两个概念:什么状态可以被认为是“暂停”?以及什么是JS发起的请求?
92 1
前端JS发起的请求能暂停吗?
|
11天前
|
JSON 前端开发 Java
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
26 6
|
4天前
|
缓存 前端开发
网页设计,若依修改06(It must be done)-----前端post请求用data传参数
网页设计,若依修改06(It must be done)-----前端post请求用data传参数
|
9天前
|
前端开发
Request(获取请求数据的)请求转发,response响应数据,将数据反馈给前端
Request(获取请求数据的)请求转发,response响应数据,将数据反馈给前端
|
20天前
|
前端开发 API 数据库
面试官问:如何防止重复提交请求,99%的前端能说出来!
如何防止接口重复提交是一个常见的系统设计问题,主要目的是确保关键操作的原子性和一致性。以下是简化的摘要: 这些方法可以单独或组合使用,取决于系统规模和业务需求。例如,对于低流量系统,简单的请求唯一ID和数据库唯一索引可能足够;而对于高并发场景,可能需要结合前端禁用和后端分布式锁来提高可靠性。幂等性设计是确保接口安全的一种通用策略,适用于各种场景。
|
1月前
|
JSON 前端开发 JavaScript
前端如何实现跨域
前端如何实现跨域
|
2月前
|
JSON 前端开发 JavaScript
第三章 前端发起HTTP请求
第三章 前端发起HTTP请求
|
2月前
|
JSON 前端开发 JavaScript
详细剖析让前端头疼的跨域问题是怎么产生的,又该如何解决
详细剖析让前端头疼的跨域问题是怎么产生的,又该如何解决
|
10天前
|
前端开发 JavaScript 数据库
如何实现前后端分离-----前端笔记
如何实现前后端分离-----前端笔记
|
10天前
|
前端开发 安全 NoSQL
技术笔记:Security前端页面配置
技术笔记:Security前端页面配置

热门文章

最新文章