跨域简单请求和非简单请求记录

cors简单请求和复杂请求

复杂请求:

第一步:预请求以OPTIONS形式发送,看看服务器是否支持跨域

第二步: 进行相关的post get put等请求

简单请求:

一个简单的请求大致如下:

HTTP方法是下列之一

HEAD GET POST

HTTP头信息不超出以下几种字段

Accept Accept-Language Content-Language Last-Event-ID 

Content-Type 仅限是下列之一

application/x-www-form-urlencoded

multipart/form-data

text/plain

服务器设置的值:

Access-Control-Allow-Origin

该属性必须得写,是允许那个域名才能跨域,* 所有的域名都能访问,但是如果写*通配符的话,那么cookie都发不过去,必须得指定域名

Access-Control-Allow-Methods

允许那个方法访问我,值可以是字符串分割字段的

Access-Control-Allow-Headers 允许的请求头数据 r如果token 通过header发送 则需设置

Access-Control-Allow-Credentials

该属性可选,它的值是一个布尔值,表示是否允许发送cookie,即cors请求中,不包括cookie,设为true,即表示服务器明确即可,cookie可以包含在请求中,一起发送给服务器

服务器具体设置

	//TP5 行为设置
	'app\\api\\behavior\\CORS' //配置文件
	//控制器
   //去下划线 驼峰命名

   public function appInit(&$params)

   {

       header('Access-Control-Allow-Origin: *');

       header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, Content-Type, Accept");

       header('Access-Control-Allow-Methods: POST,GET');

       if(request()->isOptions()){

           exit(); //预请求返回  头信息已被携带

       }

   }
前端ajax注意点(如果要传cookie)

withCredentials

上面说到,cors请求默认不发送cookie和http认证信息,如果要把cookie发送到服务端,一方面服务器要同意,指定Access-Control-Allow-Credentials

另外 必须在ajax请求中打开withCredentials

var xhr = new XMLHttpRequest()

xhr.withCredentials = true;

否则,即使服务器同意发送cookie,浏览器也不会发送,或者,服务端设置cookie,浏览器端也不会处理,但是,如果省略withCredentials设置,有的浏览器还是会一起发送cookie,这时可以显示关闭withCredentials

需要注意的是发送cookie时,Access-Control-Allow-Origin一定不能是*号,地址要明确

记录你我
请先登录后发表评论
  • latest comments
  • 总共0条评论