thinkphp5通过设置请其头允许跨域请求

第三方接口 729浏览 评论

在接口开发的过程中,或者协同开发的时候,需要用到AJAX跨域请求(不在同一个域名下的请求:如在站点A下 Ajax 请求B下的接口)。

有2个方法解决

1、通过jsonp。

2、通过设置请求头

这里我们看一下如果不设置请求头发送一个跨站点的Ajax请求代码如下

image.png


请求结果返回500错误并且提示:Access-Control-Allow-Origin' header is present on the requested resourceg


image.png


根据错误信息从字面上就能很好的理解,意思是说在请求的资源上没有被允许的头,因此该域名没有权限访问。因此我们设置请求头允许跨域请求。


这里主要说一下Thinkphp下的代码,我们使用钩子在请求开始的时候设置请求头即可。

1、新建 application/behavior/header.php 

<?php
/**
 * User: jung
 * Date: 2018/6/25
 * Time: 10:54
 */
namespace app\behavior;
use think\Response;

class Header{
    /**
     * @param $dispatch
     * 设置跨域请求【暂时设置为全部都可以请求】
     */
    public function run(&$dispatch){
        $host_name = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : "*";
        $headers = [
            "Access-Control-Allow-Origin" => $host_name,
            "Access-Control-Allow-Credentials" => 'true',
            "Access-Control-Allow-Headers" => "x-token,x-uid,x-token-check,x-requested-with,content-type,Host"
        ];
        if($dispatch instanceof Response) {
            $dispatch->header($headers);
        } else if($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
            $dispatch['type'] = 'response';
            $response = new Response('', 200, $headers);
            $dispatch['response'] = $response;
        }
    }
}


2、钩子行为绑定  applicatin/tags.php 


return [
    // 应用初始化
    'app_init'     => [],
    // 应用开始
    'app_begin'    => [
        'app\\behavior\\Header',
    ],
    // 模块初始化
    'module_init'  => [],
    // 操作开始执行
    'action_begin' => [],
    // 视图内容过滤
    'view_filter'  => [],
    // 日志写入
    'log_write'    => [],
    // 应用结束
    'app_end'      => [
        'app\\behavior\\Header',
    ],
];

注意:

app\\behavior\\Header

是 Header 类的命名空间,写错将不会被调用。

本文连接:http://www.phpbloger.com/article/63.html 文章都为原创,转载请注明出处!

相关文章