CORS代码解决方案
namespace app\index\behavior;
use think\Response;
class CORS
{
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,token, Origin, Accept, Authorization",
"Access-Control-Allow-Methods"=>"GET, POST, PUT, DELETE, PATCH, OPTIONS'",
];
if ($dispatch instanceof Response) {
$dispatch->header($headers);
} else if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
$dispatch['type'] = 'response';
$response = new Response('', 200, $headers);
$dispatch['response'] = $response;
}
}
}
application下的tags.php
return [
// 应用初始化
'app_init' => [],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => ['app\\index\\behavior\\CORS'],
];
假如谷歌浏览器请求、正常跨域默认谷歌浏览器会替你用options请求一下。
options 返回服务器针对特定资源所支持的HTTP请求方法。
如果代码是如下这么写。那么什么数据都获取不到
public function getNewCourses(Request $request)
{
if( $request->isPost() && $request->isAjax()){
$course=Db::name('courses')->order('id desc')
->field('id,img,price,click,title')
->limit(4)->select()->toArray();
echo json_encode($course);
}
}
当谷歌浏览器发送完options请求后。会把你的请求在发送一次给服务器地址。然而用jquery中的ajax方法发现没有任何返回数据。
修改PHP代码
public function getNewCourses(Request $request)
{
if( $request->isPost() && $request->isAjax()){
$course=Db::name('courses')->order('id desc')
->field('id,img,price,click,title')
->limit(4)->select()->toArray();
echo json_encode($course);
}else{
if($request->isAjax()){
echo "ajax";
}else{
echo "no";
}
}
}
结果发现
解决办法
解决方法1、PHP代码去掉请求方法的判断
public function getNewCourses(Request $request)
{
$course=Db::name('courses')->order('id desc')
->field('id,img,price,click,title')
->limit(4)->select()->toArray();
echo json_encode($course);
}
解决方法2、在前端js代码中解决
$.ajax({
url:'http://dong.wk.cn:83/index/api/getNewCourses',
type:'POST',
dataType:'JSON',
headers:{"Content-Type":"text/plain;charset=UTF-8","X-Requested-With":"XMLHttpRequest "},
data:{},
success:function(result){
手动添加headers
headers:{"Content-Type":"text/plain;charset=UTF-8","X-Requested-With":"XMLHttpRequest "}
再次请求