jersey学习:跨域JSONP(系列五)
概述
跨域
所谓跨域是针对ajax和iframe,出于网络安全的考虑在发出请求URL所做出的一些列限制:
1.同一域名,不同端口,跨域
如 http://www.test.com:8080 访问http://www.test.com:9090
2.同一域名,不同协议,跨域
如 http://www.test.com:8080 访问https://www.test.com:8080
3.不同域名,跨域
如 http://www.test.com 访问http://www.product.com
其实,根本原因是同源策略,域名、端口、协议必须相同,否则就是跨域。
解决方案
- 前端处理:JSONP(JSON with padding)是解决跨域问题的一种方案,本质上是动态创建script标签发起请求,返回的结果是任意的javascript代码。
- 后端处理:后端以http方式请求,将结果返回给客户端。
支持JSONP
jersey提供了对JSONP的支持,需要做以下的配置:
- 使用@GET,JSONP只支持GET方式
- 使用@JSONP指定请求参数,实际上也是前端的回调函数,这里使用JSONP.DEFAULT_QUERY是__callback
- 使用@Produce指定MIME类型必须是application/x-javascript
- 同系列四一样在ApplicationConfig需要配置JSON解析器
@GET
@JSONP(queryParam = JSONP.DEFAULT_QUERY)
@Produces("application/x-javascript")
@Path("/jsonp")
public Person getPersonWithJSONP(@QueryParam(JSONP.DEFAULT_QUERY) String callback) {
Person p = new Person();
p.setAge(22);
p.setName("bella");
return p;
}
在另一台电脑,或者手机地址栏输入http://localhost:9090/jersey/person/jsonp?__callback=parse,得到结果
parse({"age":22,"name":"bella"})
注意:必须是不同主机,这样才能有跨域的效果
总结
- JSONP只支持GET方式
- 需要@JSONP注解
- @Produces指定MIME类型为application/x-javascript
- 需要注册JSON解析器
- 测试的时候必须在不同主机下
Time is a great teacher, but unfortunately it kills all its pupils.

浙公网安备 33010602011771号