版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/83036276
在javascript与服务器的请求中,例如POST。
前提条件:如果你使用了自定义的headers参数content-type,将会被判定为复杂请求。
这时候,在请求数据之前,客户端会发出一个类型为options的预检数据。
用来让服务器确认此次的请求是否符合安全要求(跨域权限)。
如果服务器返回失败,则POST请求被拦截,请求失败!
也就是说,以post跨域请求为例,会发送两次请求。
第一次请求,为options预检。(此结果决定第二次请求是否发送)
第二次请求,为post正常请求。
这时候,我们需要在服务器上进行设置,允许哪些域名可以通过预检。
拿PHP服务器来举例,只需要在PHP代码中进行以下设置即可。
<?php
// 允许来自任何来源的设置方法
if (isset($_SERVER['HTTP_ORIGIN'])) {
// 必须在 $_SERVER['HTTP_ORIGIN'] 有值
// 开发时如果你想要允许所有的域名,就这样做类似于*:
// 正式部署时,需要改成固定的域名以保证安全
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// 在OPTIONS请求期间接收访问控制头
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// 也可能正在使用PUT,PATCH,HEAD等,根据需要自已添加
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
提示:在正式布署时,Access-Control-Allow-Origin,参数值最好改为指定的域名许可。
header('Access-Control-Max-Age: 86400'); // cache for 1 day 表示预检的缓存,通过一次多久后重发
这样就解决了js跨域请求的问题。