我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解决thinkphp withCredentials跨域问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解决thinkphp withCredentials跨域问题

小编给大家分享一下如何解决thinkphp withCredentials跨域问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

                                                       下面由thinkphp教程栏目给大家介绍thinkphp withCredentials 跨域问题解决思路,希望对需要的朋友有所帮助!

跨域是什么这里就不细讲, 这里主要是thinkphp5.1, 说一下大概的解决思路

首先,因为前端是自己写的, 在axios配置中, 我设置了如下

withCredentials: true // 跨域请求时发送cookie

// 创建一个axiosconst service = axios.create({  baseURL: URL ,   withCredentials: true, // 跨域请求时发送cookie  timeout: 5000 // request timeout})

在后端的配置中,配置的是

header("Access-Control-Allow-Origin: *");

故而抛出了这样一个错误

Access to XMLHttpRequest at 'http://store.ink/admin/me?sid=lbn3mpacfb3k1mbehnk9qh8kf3' from origin 'http://vue-admin-web.ink' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

意思大概为 设置 withCredentialstrue 时, origin 是不允许为 *的, origin必须设置为来源的地址

也就是 http://a.com 请求 http://b.com 的时候, http://a.com 必须设置origin 为 http://b.com 才能通过

最后参阅配置如下

 $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';        header("Access-Control-Allow-Origin: $origin");        header('Access-Control-Allow-Credentials: true');        header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');        header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');        header('Access-Control-Max-Age: 1728000');

当然, 为 * 的时候也可以这样

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-Requested-With');        header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');        header('Access-Control-Max-Age: 1728000');

首先 定义个中间件 php think make:middleware CrossDomain

<?phpnamespace app\http\middleware;use think\Response;class CrossDomain{    public function handle($request, \Closure $next)    {        $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';        header("Access-Control-Allow-Origin: $origin");        header('Access-Control-Allow-Credentials: true');        header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');        header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');        header('Access-Control-Max-Age: 1728000');        return $next($request);    }}

router.php

Route::group('', function (){    ....    这里写路由    ....})->middleware(['CrossDomain']);

然后又有一个新问题

因为如上是走的路由文件,当请求的url匹配路由的时候, 会走跨域中间件, 当大家都知道的是, delete 和 put 等方法是会提前发起一个options请求的, 也就是无法匹配路由文件,无法走跨域中间件

故而:

定义一个 错误异常接管 https://www.kancloud.cn/manual/thinkphp5_1/354092#_42

....public function render(Exception $e){    # 这里来处理跨域问题     $origin = $_SERVER['HTTP_ORIGIN'] ?? '*';    header("Access-Control-Allow-Origin: $origin");    header('Access-Control-Allow-Credentials: true');    header('Access-Control-Allow-Headers: Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With');    header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');    header('Access-Control-Max-Age: 1728000');    $type = request()->isAjax() ? 'json' : "html";    $response = \think\response\Json::create([], $type, 200, []);    return $response; # response  // 在异常处理接管中,必须返回的是一个人response响应, 而不是 `throw new `抛出一个响应}...

完成。

看完了这篇文章,相信你对“如何解决thinkphp withCredentials跨域问题”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解决thinkphp withCredentials跨域问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何解决thinkphp withCredentials跨域问题

小编给大家分享一下如何解决thinkphp withCredentials跨域问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
2023-06-08

thinkphp图片跨域不显示问题如何解决

今天小编给大家分享一下thinkphp图片跨域不显示问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先,让我们了
2023-07-05

PHP跨域问题如何解决

这篇文章主要讲解了“PHP跨域问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP跨域问题如何解决”吧!设置允许访问的域名:1、允许全部的域名访问header("Access-C
2023-07-05

VUE如何解决跨域问题

这篇文章主要介绍“VUE如何解决跨域问题”,在日常操作中,相信很多人在VUE如何解决跨域问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VUE如何解决跨域问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-07-02

iframe如何解决跨域问题

iframe如何解决跨域问题,需要具体代码示例跨域问题是前端开发中常遇到的一个难题。由于浏览器的同源策略,页面中的JavaScript无法直接访问不同域名下的资源。解决这个问题有很多方法,其中之一便是使用iframe。什么是同源策略和跨域
iframe如何解决跨域问题
2024-02-22

Vue3跨域问题如何解决

这篇文章主要介绍了Vue3跨域问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3跨域问题如何解决文章都会有所收获,下面我们一起来看看吧。vue项目配置代理vue.config.jsconst {
2023-07-05

jquery如何解决跨域问题

jQuery提供多种方法解决跨域问题,包括JSONP、CORS、代理和预检请求。选择合适的方法取决于具体需求。本文详细介绍了每种方法,包括JSONP的JSON数据包装、CORS的服务器端配置、代理的中间人角色、预检请求的复杂请求检查,以及iframe的HTML结构嵌入。此外,本文还提到了其他方法,如postMessage()、WebSocket和FetchAPI。
jquery如何解决跨域问题
2024-04-02

Ajax跨域问题如何解决

这期内容当中小编将会给大家带来有关Ajax跨域问题如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。跨域跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致解
2023-06-08

django跨域问题如何解决

Django跨域问题可以通过以下几种方法来解决:1. 使用Django的CORS插件:可以通过安装django-cors-headers插件来实现跨域访问的支持。安装插件后,在settings.py文件中添加以下配置:```pythonIN
2023-09-26

node.js中如何解决跨域问题

这篇文章主要讲解了“node.js中如何解决跨域问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“node.js中如何解决跨域问题”吧!如果用Express框架的话可以使用cors包来解决跨
2023-06-17

Ajax的跨域问题如何解决

今天小编给大家分享一下Ajax的跨域问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。跨域问题如图所示,这是通过jq
2023-06-29

vue-cli3跨域问题如何解决

本篇内容介绍了“vue-cli3跨域问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1:将任何未知请求转发到代理服务器如:前端地址
2023-07-04

如何解决Ajax请求跨域问题

这期内容当中小编将会给大家带来有关如何解决Ajax请求跨域问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、解决方案:1,在服务器端的响应头中添加一个http参数:res.setHeader("Acc
2023-06-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录