前端JS跨域
作为一个WEB开发者而言,在开发的过程中,我们可能会时不时的需要调去第三方的接口数据,而通常为了优化体验,我们会采用异步交互的方式去处理,而作为异步交互常用的AJAX,其实是基于JS的基础之上的技术,因此在使用AJAX调用第三方接口的时候,也会受到JS同源策略的影响。
所谓同源策略,是指阻止从一个域上加载的脚本获取或操作另一个域上的文档属性,简单来说就是受到请求的URL的域必须与当前Web页面的域相同
为了解决这一个问题,前端出现了一种技术,JSONP。但是JSONP只支持GET方式的跨域请求,通过JSONP技术,我们能简单的实现AJAX跨域请求:
前端AJAX:
$.ajax({
type : "get",
async : false,//async:是否异步,默认为true(异步)。
cache : false,
url : "url地址",
data : { },
dataType : "jsonp",//这个必须要加
jsonp: "jsonpCallback",//执行完毕后的回调函数
success : function(data) {
},
error : function() {
}
});
除此之外,在服务器端还要设定允许JSONP跨域
1.如果使用的是Spring4.2以上的框架版本,那么在对应的请求接口加上(@CrossOrigin):
如果这个注解加在方法上,那么就是说明这个接口可以跨域请求
如果是加在Controller类上,说明这个类里面的所有接口都能支持跨域请求。
2.做项目全局配置:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/greeting-javaconfig")
.allowedOrigins("http://localhost:8080");
}
};
}
addCorsMappings()中的参数代表支持跨域的url,
allowedOrigins()中的参数代表可以访问该接口的域名,设置为"*"可支持所有域。
3.WEB项目通用配置
(1).引入相关的jar包 cors-filter-2.1.jar, java-property-utils-1.9.jar
(2).在web.xml中做配置:
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<servlet-name>MyServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
做完以上的配置,就可以在页面中使用AJAX做跨域请求了。
如果你在请求别人的服务器,并且别人服务器不支持你做AJAX跨域请求,那么你可以采取以下的方案:
在自己的服务器上调用对方的接口,把对象接口的返回数据再返回给自己的前端。
在这个过程中,你可以使用HttpClient这个类去完成调用对方的接口。
public static String getOtherServerRequestData(String url){
String result="";
try {
// 根据地址获取请求
HttpGet request = new HttpGet(url);//这里发送get请求
// 获取当前客户端对象
HttpClient httpClient = new DefaultHttpClient();
// 通过请求对象获取响应对象
HttpResponse response = httpClient.execute(request);
// 判断网络连接状态码是否正常(0--200都数正常)
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result= EntityUtils.toString(response.getEntity(),"utf-8");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
HttpClient的Maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>