跨域问题是由于javascript语言安全限制中的同源策略造成的.
简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合.
- js不能跨域请求数据,但可以跨域请求js片段(jsonp)。
- 可以在把数据如Json包装为一个js片段,可以把数据使用js方法来包装,形成一条方法的调用语句。
- 可以使用ajax请求js片段,当js判断到达浏览器会被立即执行。
- 在浏览器端,先创建好回调方法,在回调方法中通过参数可以获得请求的数据。
比如数据为一段json,{“name”: “testName”},则可以在客户端定义一个方法如
function callback(json){
console.log(json);
}
然后在服务器端将json数据包装:
callback({“name”: "testName"});
//@RequestMapping()中需要设置属性:
//produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8"
//是设置返回数据的编码格式,防止乱码。
这样在客户端用ajax请求时就可以成功,而且js片段到达客户端是立即执行的,在客户端会执行callback方法。
服务器端包装数据的时候,有是需要包装,有时不需要,但包装的话需要用到String连接方法名,所以我们需要将json转化为String。
String json = JsonUtils.objectToJson(result);
这样就可以把json转化为String类型。
另一种方式:
@RequestMapping("directives.json")
@ResponseBody
public MappingJacksonValue directives(String callback) {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue("you can put everything here.");
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
其中,callback为请求传递过来的方法名
mappingJacksonValue的setJsonFunction()方法可以将方法名加到数据的外面,即包装数据。
JsonP不仅能用在ajax请求中,在<script>
标签中也同样可以,即设置其src属性.