SpringBoot解决跨域请求拦截问题代码实例

  


  

  

同源策略:判断是否是同源的,主要看这三点,协议,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”);   }   }      

再次访问将会返回正常数据。

  

 SpringBoot解决跨域请求拦截问题代码实例

  

除了以上的配置外,还可以做更细致的限制

  

比如对请求的标题,请求的方法POST/GET ....请求的源进行限制。

  

 SpringBoot解决跨域请求拦截问题代码实例

  

同时还可以使用注解@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解决跨域请求拦截问题代码实例