跨域

  1. 前面有篇文章laravel跨域请求,说的是laravel项目中不用域名间的跨域问题,在laravel路由文件或者中间件中如下设置

    // 设置允许跨域
    header('Access-Control-Allow-Origin:*');
    header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE');
    header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept');
    header('Access-Control-Allow-Credentials:true');

并且在csrf的中间件文件中忽略你要请求的路由

   class VerifyCsrfToken extends BaseVerifier
{
    /**
 * The URIs that should be excluded from CSRF verification.
 *
 * @var array
 */
protected $except = [
    '/api/*'
];
}

就OK了

Paste_Image.png
但是今天有需要是跨域访问另外一个项目的接口。仍然按照如下设置之后,得到的结果是这样的

Paste_Image.png

这个字面意思是 请求头中的X-CSRF_TOKEN不被Access-Allow-Headers 允许,
那这是个啥玩意儿呢,猜想是之前的ajax请求设置了这个请求头,所以本次请求也携带了,验验证一下,我把这个请求放在了所有js文件的最上面,结果能成功请求。所以确实是请求头中的设置对现在造成了影响,那么怎样解决呢?

首先第一反应是去百度ajax清除请求头的方法,并没有找到,由于自己入行尚短,对http请求不是太理解,所以也踩了一些坑。我就对比两次请求的请求头,发现了一些问题。

Paste_Image.png
看到这个Access-Control-Request-Headers:x-csrf-token,突然想到自己在服务器端设置过的允许跨域的内容

header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept');

恍然大悟,服务器端定义了允许跨域访问的请求头,对应的应该是这一部分内容

Paste_Image.png

于是,我加上了他说不被允许的这个X-CSRF-TOKEN

//  设置允许跨域
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE');
header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept, X-CSRF-TOKEN');
header('Access-Control-Allow-Credentials:true');

就OK了。总结,入行也半年了,但是迟迟对http没有认真的学习了解过。

本作品采用《CC 协议》,转载必须注明作者和本文链接
毛仔
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!