JsonpAdvice
跨域产生的原因:
1.浏览器原因
2.如果是xhrhttprequest请求
3.跨域(协议、域名、端口号不统一)
满足以上三个条件才可能会出现跨域现象。
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。
使用JSONP解决跨域问题,只改前端不改后端报语法错误(如图中第二条错误)的原因:JSONP是使用动态创建的一个script标签,而script标签返回的是JS代码,但是服务器后台代码没有做任何改动,返回的还是json对象。浏览器会把json对象和字符串当作是JS代码来解析所以就会报错了。解决方法:需要修改后台代码,新建一个类在构造方法里写super("callback");
由图一和图二可以知道,当在前端代码将 DataType 改为 jsonp 后,依旧会报跨域问题;因为这时后台传给前端的还是json格式的数据,存在类型的异常问题;所以这里需要对后台代码进行修改,以适应jsonp的数据格式。
解决方案通过创建JsonpAdivice 切面解决


使用jsonp 解决跨域问题时,后台代码是需要做改动的,创建一个JsonpAdivice 切面,集成AbstractJsonpResponseBodyAdvice (Jsonp的格式支持接口);
实现接口方法: JsonpAdvice(),
super("callback")这里的意思是调用父类的构造方法对回调的参数进行格式转化(个人理解)
解决跨域问题②:
修改数据类型为 jsonp 格式
dataType:"jsonp",
使用jsonp后台同样需要改动
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。
使用jsonp后台代码也要改动,否则返回的json不能被页面解析,会提示js语法错误
jsoup 继承这个类 就能产生对应的script的返回Type
JSONP如果解决跨域思路:利用script标签,请求可以跨域来解决跨域问题。
办法:使用ajax发送请求,dataType为JSONP,即可解决跨域问题。但这需要接口返回一个script标签,如果返回其他格式的数据,浏览器将会把它当成是js代码解析,所以将会报错
JSONP如果解决跨域思路:利用script标签,请求可以跨域来解决跨域问题。
办法:使用ajax发送请求,dataType为JSONP,即可解决跨域问题。但这需要接口返回一个script标签,如果返回其他格式的数据,浏览器将会把它当成是js代码解析,所以将会报错