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

其实,根本原因是同源策略,域名、端口、协议必须相同,否则就是跨域。

解决方案

  1. 前端处理:JSONP(JSON with padding)是解决跨域问题的一种方案,本质上是动态创建script标签发起请求,返回的结果是任意的javascript代码。
  2. 后端处理:后端以http方式请求,将结果返回给客户端。

支持JSONP

jersey提供了对JSONP的支持,需要做以下的配置:

  1. 使用@GET,JSONP只支持GET方式
  2. 使用@JSONP指定请求参数,实际上也是前端的回调函数,这里使用JSONP.DEFAULT_QUERY是__callback
  3. 使用@Produce指定MIME类型必须是application/x-javascript
  4. 系列四一样在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"})

 注意:必须是不同主机,这样才能有跨域的效果

总结

  1. JSONP只支持GET方式
  2. 需要@JSONP注解
  3. @Produces指定MIME类型为application/x-javascript
  4. 需要注册JSON解析器
  5. 测试的时候必须在不同主机下
posted @ 2016-03-15 11:56  贝拉巴拉  阅读(1856)  评论(0)    收藏  举报