• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 分享thinkphp withCredentials跨域问题解决思路

分享thinkphp withCredentials跨域问题解决思路

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了thinkphp,withCredentials,跨域问题解决思路等相关知识,希望对您有所帮助

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


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.

意思大概为 设置 withCredentials 为 true 时, 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 `抛出一个响应}...

完成。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • laravel与thinkphp之间的区别与优缺点
  • ThinkPhp5.1制作微信支付以及支付后的几种状态说明
  • ThinkPHP3.2.3如何从php5升级到php7
  • 详解thinkphp下部分内容的ajax无刷新分页
  • 你知道Thinkphp5.1让验证码在Electron-vue中怎么用?
  • 关于ThinkPHP的join关联查询不使用默认的表前缀
  • ThinkPHP5通过ajax插入图片并实时显示(完整代码)
  • 分析 thinkphp5 显示render不兼容问题
  • ThinkPHP5访问怎么去除/public/index.php
  • Thinkphp5.1详细讲解中间件的用法

相关文章

  • 2022-04-29帝国cms更换php7环境后台空白
  • 2022-04-29PHP指定范围内且不重复的随机值方法
  • 2022-04-29Photoshop设计时尚大气的3D螺旋球
  • 2022-04-29renderjs有什么用?聊聊uniapp中用renderjs的一些细节
  • 2022-04-29一起看看JavaScript如何获取页面上被选中的文字
  • 2022-04-29vue+flask实现视频合成功能(拖拽上传)
  • 2022-04-29分享Laravel7消息通知日期序列化解决方案
  • 2022-04-29vue中h5端打开app(判断是安卓还是苹果)
  • 2022-04-29“内容”优化影响排名 “内容”提升用户体验
  • 2022-04-29PHP读取Excel图片对象,并保存替换为相对路径

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • html+css如何实现自定义图片上传按钮
    • ThinkPHP菜单无极分类实例讲解
    • 如何使用yum安装指定版本的php
    • 手把手带你了解Vue中怎么使用filters过滤器?2种用法浅析
    • vue.js项目怎么实现百度地图显示
    • 浅谈bootstrapTable+jstree插件对树列表条件和查询条件的处理
    • Photoshop制作绿色风格金属立体字教程
    • 小程序怎么查看base64图片
    • 3大技巧秒杀百度的首页排名
    • PHP调用实现波场交互[支持TRX/TRC20]

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有