前端JS跨域请求

来源:互联网 发布:淘宝静物拍摄相机 编辑:程序博客网 时间:2024/06/05 20:00

前端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>