- jaonp方式(jsonp 是通过script 标签方式实现的,相当于钻了个空子)
- 更改服务器响应头:(网站开发建议使用这种),更改响应头后允许跨域。
前端
$.ajax({
type:"GET",
url:"http://www.deardull.com:9090/getMySeat", //访问的链接
dataType:"jsonp", //数据格式设置为jsonp
jsonp:"callback", //Jquery生成验证参数的名称
success:function(data){ //成功的回调函数
alert(data);
},
error: function (e) {
alert("error");
}
});
后端
@ResponseBody
@RequestMapping("/getMySeat")
public String getMySeatSuccess(@RequestParam("callback") String callback){
Gson gson=new Gson();
Map<String,String> map=new HashMap<>();
map.put("seat","1_2_06_12");
logger.info(callback);
return callback+"("+gson.toJson(map)+")";
}
需要注意的是:
前端注意与后端沟通约定jsonp的值,通常默认都是用callback。
后端根据jsonp参数名获取到参数后要与本来要返回的json数据按“callback(json)”的方式构造。
jsonp 是通过script 标签方式实现的,相当于钻了个空子。不用jsonp 又该如何实现跨域访问呢?
首先了解下请求的方式:
1、简单请求
请求类型为HEAD、GET、POST,并满足一定的条件的请求。
2、非简单请求
当然就是除简单请求之外的请求咯。
Ajax请求为非简单请求,简单请求直接发送,而非简单请求在实际请求之前,会先发送一个“预检请求”(preflight request),预检请求通过访问控制检查后才会发送需要的请求。
预检请求不能通过检查情况:
预检请求不通过,可能是由于Origin 为null 造成的,此时会提示如下错误:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
服务器端需设置的几个响应头:
Access-Control-Allow-Origin :允许的源,以逗号分隔各源的字符串,如:"www.a.com,www.b.com";
Access-Control-Allow-Methods:允许的请求方式,同上,如:"GET,PUT,POST";
Access-Control-Allow-Credentials:true|false,是否允许传送cookie,需设置为true;
Access-Control-Expose-Headers:允许的请求头。XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。如要想从响应头中获取orgin、accept 头,对应值为:"orgin,accept"。