副问题[/!--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、统一个端口的资源,从而切条约源计策实现跨域会见。
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举办全局跨域设置
- @Configuration
- public class GlobalCorsConfig {
- @Bean
- public CorsFilter corsFilter() {
-
- CorsConfiguration config = new CorsConfiguration();
- //开放哪些ip、端口、域名的会见权限,星号暗示开放全部域
- config.addAllowedOrigin("*");
- //是否应承发送Cookie信息
- config.setAllowCredentials(true);
- //开放哪些Http要领,应承跨域会见
- config.addAllowedMethod("GET","POST", "PUT", "DELETE");
- //应承HTTP哀求中的携带哪些Header信息
- config.addAllowedHeader("*");
- //袒露哪些头部信息(由于跨域会见默认不能获取所有头部信息)
- config.addExposedHeader("*");
-
- //添加映射路径,“/**”暗示对全部的路径实施全局跨域会见权限的配置
- UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
- configSource.registerCorsConfiguration("/**", config);
-
- return new CorsFilter(configSource);
- }
- }
3.2. 重写WebMvcConfigurer的addCorsMappings要领(全局跨域设置)
- @Configuration
- public class GlobalCorsConfig {
- @Bean
- public WebMvcConfigurer corsConfigurer() {
- return new WebMvcConfigurer() {
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**") //添加映射路径,“/**”暗示对全部的路径实施全局跨域会见权限的配置
- .allowedOrigins("*") //开放哪些ip、端口、域名的会见权限
- .allowCredentials(true) //是否应承发送Cookie信息
- .allowedMethods("GET","POST", "PUT", "DELETE") //开放哪些Http要领,应承跨域会见
- .allowedHeaders("*") //应承HTTP哀求中的携带哪些Header信息
- .exposedHeaders("*"); //袒露哪些头部信息(由于跨域会见默认不能获取所有头部信息)
- }
- };
- }
- }
3.3.行使CrossOrigin注解(局部跨域设置)
- 将CrossOrigin注解加在Controller层的要领上,该要领界说的RequestMapping端点将支持跨域会见
- 将CrossOrigin注解加在Controller层的类界说处,整个类全部的要领对应的RequestMapping端点都将支持跨域会见
- @RequestMapping("/cors")
- @ResponseBody
- @CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
- public String cors( ){
- return "cors";
- }
3.4 行使HttpServletResponse配置相应头(局部跨域设置)
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|