Java代码调用外部web不会出现跨域访问,Ajax代码调用外部的web会出现跨域访问情况。
原因在于浏览器的同源策略,是浏览器的行为,主要是为了保护本地数据不被js代码获取回来的数据污染,拦截了服务器响应的数据。
大家都知道远程服务访问的三大条件是 主机+协议+端口,其中一点不一样,浏览器就认为违背了同源策略。
我们在实际开发中避免不了远程调用,出现这种问题该如何解决呢?
两种解决方案
1.在服务端控制,其本质是修改响应头
CorsFilter过滤器
1.1添加依赖必不可少
<!-- corsFilter过滤器依赖 -->
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
<scope>runtime</scope>
</dependency>
1.2web.xml文件配置
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<!-- 设置运行那些域来访问自己 -->
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.jsonp解决跨域访问
大家可以想一下,我们在写js代码的时候,引入了很多js或者jq文件,这其实就是一种跨域访问,但是它为什么可以正常访问呢?原因在于js代码没有跨域限制,同理,我们在进行跨域的时候把回调函数伪装成js代码,有了这个载体,同样可以拿到数据!jsonp的本质是从客户端解决问题。
1.利用jquery对jsonp的支持,jq会自动产生回调函数
1.服务端方法格式:
//异步响应
@RequestMapping("/")
@ResponseBody
public MappingJacksonValue sendRed2(Red red,String callback(固定写法,jquery自动加的就是此名称)){
MappingJacksonValue value = new MappingJacksonValue(red);
//判断,如果不为空,远程访问
if(!StringUtils.isEmpty(callback)){
value.setJsonpFunction(callback);
}
return value;
}
2.客户端页面
function mm(){
$.post("http://localhost:8686/sendRed2{"c1":110,"c2":120,"money":119},function(re){
alert(re);
},"jsonp")//在发送Ajax的时候多加一个参数,表示使用jQuery对jsonp的封装。
}
这样一来,跨域访问就解决了,是不是很神奇呢?