加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

详解SpringBoot应用跨域访问解决方案

发布时间:2019-11-19 03:44:04 所属栏目:移动互联 来源:佚名
导读:一、什么是跨域会见 说到跨域会见,必需先表明一个名词:同源计策。所谓同源计策就是在赏识器端出于安详考量,向处事端提倡哀求必需满意:协议沟通、Host(ip)沟通、端口沟通的前提,不然会见将被榨取,该会见也就被称为跨域会见。 固然跨域会见被榨取之后
副问题[/!--empirenews.page--]

一、什么是跨域会见

说到跨域会见,必需先表明一个名词:同源计策。所谓同源计策就是在赏识器端出于安详考量,向处事端提倡哀求必需满意:协议沟通、Host(ip)沟通、端口沟通的前提,不然会见将被榨取,该会见也就被称为跨域会见。

固然跨域会见被榨取之后,可以在必然水平上进步了应用的安详性,但也为开拓带来了必然的贫困。好比:我们开拓一个前后端疏散的易用,页面及js陈设在一个主机的nginx处事中,后端接口陈设在一个tomcat应用容器中,当前端向后端提倡哀求的时辰必然是不切条约源计策的,也就无法会见。那么我们怎样办理这个题目?就是本文必要向各人声名的内容。

二、跨域会见的办理方案有哪些?

2.1.第一类方案:前端办理方案

固然赏识器对付不切条约源计策的会见是榨取的,可是如故存在破例的环境,如以下资源引用的标签不受同源计策的限定:

  • html的script标签
  • html的link标签
  • html的img标签
  • html的iframe标签:对付行使jsp、freemarker开拓的项目,这是实现跨域会见最常见的要领,

除了基于HTML自己的特征实现跨域会见,我们还可以行使jsonp、window的postMessage实现跨域会见。这些都是前端实现跨域会见的方法。

2.2.第二类方案:行使署理

现实上对跨域会见的支持在处事端实现起来越发轻易,最常用的要领就是通过署理的方法,如:

  • nginx或haproxy署理跨域
  • nodejs中间件署理跨域

着实实现署理跨域的逻辑很是简朴:就是在差异的资源处事:js资源、html资源、css资源、接口数据资源处事的前端搭建一此中间层,全部的赏识器及客户端会见都通过署理转发。以是在赏识器、客户端看来,它们会见的都是统一个ip、统一个端口的资源,从而切条约源计策实现跨域会见。

详解SpringBoot应用跨域会看法决方案

2.3 第三类方案:CORS

跨域资源共享(CORS):通过修改Http协议header的方法,实现跨域。说的简朴点就是,通过配置HTTP的相应头信息,奉告赏识器哪些环境在不切条约源计策的前提下也可以跨域会见,赏识器通过理会Http协议中的Header执行详细判定。详细的Header如下:

CROS跨域常用header

  • Access-Control-Allow-Origin: 应承哪些ip或域名可以跨域会见
  • Access-Control-Max-Age: 暗示在几多秒之内不必要一再校验该哀求的跨域会见权限
  • Access-Control-Allow-Methods: 暗示应承跨域哀求的HTTP要领,如:GET,POST,PUT,DELETE
  • Access-Control-Allow-Headers: 暗示会见哀求中应承携带哪些Header信息,如: Accept 、 Accept-Language 、 Content-Language 、 Content-Type
三、SpringBoot下实现CORS的四种方法

为各人先容四种实现CORS的要领,两种是全局设置,两种是局部接口见效的设置。一样平常来说,SpringBoot项目回收个中一种方法实现CORS即可。

3.1.行使CorsFilter举办全局跨域设置

  1. @Configuration 
  2.     public class GlobalCorsConfig { 
  3.         @Bean 
  4.         public CorsFilter corsFilter() { 
  5.      
  6.             CorsConfiguration config = new CorsConfiguration(); 
  7.             //开放哪些ip、端口、域名的会见权限,星号暗示开放全部域 
  8.             config.addAllowedOrigin("*"); 
  9.             //是否应承发送Cookie信息 
  10.             config.setAllowCredentials(true); 
  11.             //开放哪些Http要领,应承跨域会见 
  12.             config.addAllowedMethod("GET","POST", "PUT", "DELETE"); 
  13.             //应承HTTP哀求中的携带哪些Header信息 
  14.             config.addAllowedHeader("*"); 
  15.             //袒露哪些头部信息(由于跨域会见默认不能获取所有头部信息) 
  16.             config.addExposedHeader("*"); 
  17.      
  18.             //添加映射路径,“/**”暗示对全部的路径实施全局跨域会见权限的配置 
  19.             UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); 
  20.             configSource.registerCorsConfiguration("/**", config); 
  21.      
  22.             return new CorsFilter(configSource); 
  23.         } 
  24.     } 

3.2. 重写WebMvcConfigurer的addCorsMappings要领(全局跨域设置)

  1. @Configuration 
  2.     public class GlobalCorsConfig { 
  3.         @Bean 
  4.         public WebMvcConfigurer corsConfigurer() { 
  5.             return new WebMvcConfigurer() { 
  6.                 @Override 
  7.                 public void addCorsMappings(CorsRegistry registry) { 
  8.                     registry.addMapping("/**")    //添加映射路径,“/**”暗示对全部的路径实施全局跨域会见权限的配置 
  9.                             .allowedOrigins("*")    //开放哪些ip、端口、域名的会见权限 
  10.                             .allowCredentials(true)  //是否应承发送Cookie信息  
  11.                             .allowedMethods("GET","POST", "PUT", "DELETE")     //开放哪些Http要领,应承跨域会见 
  12.                             .allowedHeaders("*")     //应承HTTP哀求中的携带哪些Header信息 
  13.                             .exposedHeaders("*");   //袒露哪些头部信息(由于跨域会见默认不能获取所有头部信息) 
  14.                 } 
  15.             }; 
  16.         } 
  17.     } 

3.3.行使CrossOrigin注解(局部跨域设置)

  • 将CrossOrigin注解加在Controller层的要领上,该要领界说的RequestMapping端点将支持跨域会见
  • 将CrossOrigin注解加在Controller层的类界说处,整个类全部的要领对应的RequestMapping端点都将支持跨域会见
  1. @RequestMapping("/cors") 
  2.     @ResponseBody 
  3.     @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)  
  4.     public String cors( ){ 
  5.         return "cors"; 
  6.     } 

3.4 行使HttpServletResponse配置相应头(局部跨域设置)

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读