一、介绍
1、跨域:在www.jt.com的网页上,访问manage.jt.com上的资源,
(跨域不是仅仅打开而是去操作另一个系统的资源)
2、原因:在不同的系统间(域名不同)程序调用时,违反了浏览器的协议,则不允许跨域访问---> 数据就不能获取
3、同域和跨域:
1)同域和跨域:
检测通信协议(http/https), 域名,端口,3者全部相同,才为同域
2)一级跨域 aaa.xxx.com-->bbb.xxx.com
二级跨域 xxx.aaa.com-->xxx.bbb.com
3、JSONP跨域
在JS-前端jsp,html中进行跨域访问的;
优点:减缓服务器的压力,把压力转给客服端的浏览器
JSONP调用原则:需要通过参数将方法名称进行传递
一般参数的名称固定为callback ;
如果采用JSONP的调用规则,需要将json数据通过函数名称包装,之后返回;
形式为 url?callback=函数名称(json数据)
4、举例实例
1)前端请求 manage.jt资源
alert("测试访问开始!!!!!") $.ajax({ url:"http://manage.jt.com/web/testJSONP", //定义远程访问路径 type:"get", //以get方式请求 dataType:"jsonp", //返回值的数据类型为jsonp jsonp: "callback", //指定参数名称 //指定回调函数名称 :后台需要按照约定进行封装,返回时格式为: hello(ItemCatResult的json形式) jsonpCallback: "hello", success:function (data){ alert(data.id); //转化为字符串使用 //var obj = eval("("+data+")"); //alert(obj.name); } }); |
注意:http://www.jt.com/JSONP.html 使用这种域名格式访问,而不要使用ip访问,例如localhost:8080
服务端返回:
request header: http://manage.jt.com/web/testJSONP?callback=hello&_=1223233555 |
2)后台的controller
@Controller public class JSONPController { @RequestMapping("/web/testJSONP") //@ResponseBody public void testJSON(String tomcat, HttpServletResponse response) throws IOException{ User user = new User(); user.setId(100); ObjectMapper objectMapper = new ObjectMapper(); String data = objectMapper.writeValueAsString(user); String json = hello+"("+data+")"; response.setContentType("text/html;charset=utf-8"); response.getWriter().write(json); System.out.println("JSON数据跨域请求成功!!!"); } } |
4、jsonp举例2
当采用jsonp调用时,
1)如果返回结果是string类型的json串,则必须进行对象转换,如下:
JSON.parse(获取的json串); 或 eval(json串)
2)如果返回的是对象格式,不需要进行对象转化,因为jsonp调用时返回对象后自动的转化js对象,使对象.属性能正确的调用
|
5、HttpClient跨域
说明:Java代码需要模拟http协议发出http请求,获取需要的数据,这样的方式叫做:HTTPClient ;
1)、jsop和httpClient的区别:
jsop的请求 是由浏览器解析JS发出的http请求 ;
httpclient是由Java代码模拟http协议发出的http请求 ;
2)具体实现:
CloseableHttpClient httpClient = HttpClients.createDefault(); String uri = "http://item.jd.com/806876.html"; HttpGet get = new HttpGet(uri); HttpPost httpPost = new HttpPost(uri); CloseableHttpResponse response =httpClient.execute(httpPost); //判断请求是否有效 if(response.getStatusLine().getStatusCode() == 200){ System.out.println("请求成功!!!"); System.out.println(EntityUtils.toString(response.getEntity())); } |