系统跨域:jsonp ; httpClient ;

一、介绍

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对象,使对象.属性能正确的调用

//url:http://sso.jt.com/user/query/" + _ticket
	@RequestMapping("/query/{ticket}")
	@ResponseBody
	public MappingJacksonValue findUserByTicket(@PathVariable String ticket,String callback){
		try {	
			String userJSON = jedisCluster.get(ticket);
			if(!StringUtils.isEmpty(userJSON)){
				MappingJacksonValue jacksonValue = 
						new MappingJacksonValue(SysResult.oK(userJSON));
				jacksonValue.setJsonpFunction(callback);
				return jacksonValue;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		MappingJacksonValue jacksonValue = 
				new MappingJacksonValue(SysResult.build(201,"查询失败"));
		jacksonValue.setJsonpFunction(callback);
		return jacksonValue;
	}

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()));
}    

猜你喜欢

转载自blog.csdn.net/qq_24271537/article/details/81365340