⽹站跨域的五种解决⽅式
1、什么是跨越?
⼀个⽹页向另⼀个不同域名/不同协议/不同端⼝的⽹页请求资源,这就是跨域。
跨域原因产⽣:在当前域名请求⽹站中,默认不允许通过ajax请求发送其他域名。
2、为什么会产⽣跨域请求?
因为浏览器使⽤了同源策略
3、什么是同源策略?
同源策略是Netscape提出的⼀个著名的安全策略,现在所有⽀持JavaScript的浏览器都会使⽤这个策略。同源策略是浏览器最核⼼也最基本的安全功能,如果缺少同源策略,浏览器的正常功能可能受到影响。可以说web是构建在同源策略的基础之上的,浏览器只是针对同源策略的⼀种实现。
4、为什么浏览器要使⽤同源策略?
是为了保证⽤户的信息安全,防⽌恶意⽹站窃取数据,如果⽹页之间不满⾜同源要求,将不能:
1、共享Cookie、LocalStorage、IndexDB
2、获取DOM
3、AJAX请求不能发送
同源策略的⾮绝对性:
<script></script>
<img/>
<iframe/>
ajax实例里面的函数<link/>
<video/>
<audio/>
等带有src属性的标签可以从不同的域加载和执⾏资源。其他插件的同源策略:flash、java applet、silve
rlight、googlegears等浏览器加载的第三⽅插件也有各⾃的同源策略,只是这些同源策略不属于浏览器原⽣的同源策略,如果有漏洞则可能被⿊客利⽤,从⽽留下XSS攻击的后患
解决⽅案有五:
1、前端使⽤jsonp (不推荐使⽤)
当我们正常地请求⼀个JSON数据的时候,服务端返回的是⼀串 JSON类型的数据,⽽我们使⽤ JSONP模式来请求数据的时候服务端返回的是⼀段可执⾏的 JavaScript代码。因为jsonp 跨域的原理就是⽤的动态加载 script的src ,所以我们只能把参数通过 url的⽅式传递,所以jsonp的 type类型只能是get⽰例:
$.ajax({
url: '192.168.1.114/yii/demos/test.php', //不同的域
type: 'GET', // jsonp模式只有GET 是合法的
data: {
'action': 'aaron'
},
dataType: 'jsonp', // 数据类型
jsonp: 'backfunc', // 指定回调函数名,与服务器端接收的⼀致,并回传回来
})
使⽤JSONP 模式来请求数据的整个流程:客户端发送⼀个请求,规定⼀个可执⾏的函数名(这⾥就是 jQuery做了封装的处理,⾃动帮你⽣成回调函数并把数据取出来供success属性⽅法来调⽤,⽽不是传递的⼀个回调句柄),服务器端接受了这个 backfunc函数名,然后把数据通过实参的形式发送出去
(在jquery 源码中, jsonp的实现⽅式是动态添加<script>标签来调⽤服务器提供的 js脚本。jquery 会在window对象中加载⼀个全局的函数,当<script>代码插⼊时函数执⾏,执⾏完毕后就<script>会被移除。同时jquery还对⾮跨域的请求进⾏了优化,如果这个请求是在同⼀个域名下那么他就会像正常的 Ajax请求⼀样⼯作。)
2、后台Http请求转发
HttpGet get = new HttpGet("localhost:8080/test"); //创建get请求
CloseableHttpResponse response = ute(get); //执⾏get请求
String mes = Entity()); //将返回体的信息转换为字符串
System.out.println(mes);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3、后台配置同源Cors (推荐)
在SpringBoot2.0 上的跨域⽤以下代码配置即可完美解决你的前后端跨域请求问题
在SpringBoot2.0 上的跨域⽤以下代码配置即可完美解决你的前后端跨域请求问题
import t.annotation.Bean;
import t.annotation.Configuration;
import org.s.CorsConfiguration;
import org.s.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 实现基本的跨域请求
* @author linhongcun
*
*/
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
/*是否允许请求带有验证信息*/
corsConfiguration.setAllowCredentials(true);
/*允许访问的客户端域名*/
corsConfiguration.addAllowedOrigin("*");
/*允许服务端访问的客户端请求头*/
corsConfiguration.addAllowedHeader("*");
/*允许访问的⽅法名,GET POST等*/
corsConfiguration.addAllowedMethod("*");
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
4、使⽤SpringCloud⽹关
服务⽹关(zuul)⼜称路由中⼼,⽤来统⼀访问所有api接⼝,维护服务。
Spring Cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的⾃动化维护,所以在使⽤服务路由配置的时候,我们不需要向传统路由配置⽅式那样去指定具体的服务实例地址,只需要通过Ant模式配置⽂件参数即可
5、使⽤nginx做转发
现在有两个⽹站想互相访问接⼝在a.a:81/A中想访问b.b:81/B那么进⾏如下配置即可
然后通过访问/A⾥⾯即可访问/B
server {
listen 80;
server_name ;
location /A {
proxy_pass a.a:81/A;
index index.html index.htm;
}
location /B {
proxy_pass b.b:81/B;
index index.html index.htm;
}
}
如果是两个端⼝想互相访问接⼝在b.b:80/Api中想访问b.b:81/Api那么进⾏如下配置即可
server_name b.b;
location /Api {
proxy_pass b.b:81/Api; index index.html index.htm;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论