OhNaNaSun / myapp

from todo
3 stars 0 forks source link

浏览器跨域 #5

Open OhNaNaSun opened 8 years ago

OhNaNaSun commented 8 years ago

如何解决 Ajax 跨域请求不到的问题 ajax 设置Access-Control-Allow-Origin实现跨域访问 跨域资源共享 CORS 详解

OhNaNaSun commented 8 years ago

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

只要同时满足以下两大条件,就属于简单请求。

(1) 请求方法是以下三种方法之一:

(2)HTTP的头信息不超出以下几种字段:

凡是不同时满足上面两个条件,就属于非简单请求。 浏览器对这两种请求的处理,是不一样的。

参考:跨域资源共享详解 CORS [http://www.ruanyifeng.com/blog/2016/04/cors.html]

简单请求

前端

 $.ajax({
        type: "POST",
        url: "http://XXX/testCORS",
        //contentType: "application/json;charset=UTF-8",使用默认的application/x-www-form-urlencoded
        dataType: "json",
        data: {},
        success: function () {
         }
  });

后端

 router.post('/testCORS', function(req, res){
   res.setHeader('Access-Control-Allow-Origin', '*');
   res.send({msg:"success"});
})

非简单请求

前端(设置了contentType: "application/json;charset=UTF-8"):

  $.ajax({
        type: "POST",
        url: "http://XXXX/testCORS",
        contentType: "application/json;charset=UTF-8",
        dataType: "json",
        data: {},
        success: function () {
         }
  });

后端(相比简单请求,多了OPTIONS的处理):

 router.options('/testCORS', function(req, res){
   //res.setHeader('Access-Control-Allow-Methods', 'POST');
   res.setHeader('Access-Control-Allow-Origin', '*');//重要
   res.setHeader('Access-Control-Allow-Headers', 'content-type');//重要
   res.status = 204;
   res.send();
})
router.post('/testCORS', function(req, res){
   res.setHeader('Access-Control-Allow-Origin', '*');
   res.send({msg:"success"});
})