同源策略:判断是否是同源的,主要看这三点,协议,ip,端口。
同源策略就是浏览器出于网站安全性的考虑,限制不同源之间的资源相互访问的一种政策。
比如在域名https://www.baidu.com下,脚本不能够访问https://www.sina.com源下的资源,否则将会被浏览器拦截。
注意两点:
1。必须是脚本请求,比如AJAX请求。
但是如下情况不会产生跨域拦截
& lt; img src=" https://www.yisu.com/zixun/xxx "/比; & lt; a href=" https://www.yisu.com/zixun/xxx "比;& lt;/a>
2。跨域拦截是前端请求已经发出,并且在后端返回响应时检查相关参数,是否允许接收后端请求。
在微服务开发中,一个系统包含多个微服务,会存在跨域请求的场景。
本文主要讲解SpringBoot解决跨域请求拦截的问题。
这里创建两个web项目,web1和web2。
web2项目请求web1项目的资源。
这里只贴关键代码,完整代码参考GitHub
<强> WEB2 强>
创建一个控制器返回html页面
@Slf4j @ controller 公开课HomeController { @RequestMapping(“/指数”) 公共字符串回家(){ log.info(“/指数”); 返回“/home”; } }
html页面home。
这里创建了一个按钮,按钮按下则请求资源:http://localhost: 8301/你好
& lt; !DOCTYPE html> & lt; html lang=癳n”比; & lt; head> & lt;元charset=皍tf - 8”比; & lt; title> web2 & lt;脚本src=" https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js "比; & lt;/script> & lt; script> $(函数(){ $ (" # testBtn”)。点击(函数(){ 控制台。日志(“testbtn…”); $ . get (" http://localhost: 8301/hello”、功能(数据、状态){ alert("数据:“+数据+“\ n状态:“+状态); }); }) }) & lt;/script> & lt;/head> & lt; body> web2 & lt;按钮id=" testBtn "祝辞测试& lt;/button> & lt;/body> & lt;/html>
<强> WEB1 强>
@Slf4j @RestController 公开课Web1Controller { @RequestMapping (“/hello”) 公共字符串hello () { log.info (“hello”); 返回“你好,”+新日期().toString (); } }
这里配置两个项目为不同的端口。
WEB1为8301
WEB2为8302
因此是不同源的。
在web1还没有配置允许跨域访问的情况下
按下按钮,将会出现错误。显示标题中没有Access-Control-Allow-Origin
访问XMLHttpRequest的http://localhost: 8301/你好从起源的http://localhost: 8300已经被歌珥政策:没有提供“Access-Control-Allow-Origin”的头> @ configuration 公共类WebMvcConfig实现WebMvcConfigurer { @Override 公共空间addCorsMappings (CorsRegistry注册表){ registry.addMapping ("/hello”); } }
再次访问将会返回正常数据。
除了以上的配置外,还可以做更细致的限制
比如对请求的标题,请求的方法POST/GET ....请求的源进行限制。
同时还可以使用注解@CrossOrigin来替换上面的配置。
@Slf4j @RestController 公开课Web1Controller { @CrossOrigin @RequestMapping (“/hello”) 公共字符串hello () { log.info (“hello”); 返回“你好,”+新日期().toString (); } }
注解可以用在类上,也可以用在方法上,但必须是控制器类
配置和上面一样,也是可以对方法,头,源进行个性化限制。
@Target({应用。方法,ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Documented 公共@ interface CrossOrigin {/* * @deprecated */@Deprecated String [] DEFAULT_ORIGINS=new String [] {“*”};/* * @deprecated */@Deprecated String [] DEFAULT_ALLOWED_HEADERS=new String [] {“*”};/* * @deprecated */@Deprecated 布尔DEFAULT_ALLOW_CREDENTIALS=false;/* * @deprecated */@Deprecated 长DEFAULT_MAX_AGE=1800升; @AliasFor(“起源”) String[]默认值(){}; @AliasFor(“价值”) String[]起源(){}违约; String [] allowedHeaders违约(){}; String [] exposedHeaders违约(){}; RequestMethod[]方法默认(){}; 字符串allowCredentials()默认””; 长maxAge()默认1 l; }SpringBoot解决跨域请求拦截问题代码实例