东莞免费建网站企业,天津圣辉友联网站建设,顺德网页制作公司,定兴网站建设公司先说明一个坑。在跨域的情况下#xff0c;浏览器针对复杂请求#xff0c;会发起预检OPTIONS请求。如果服务端对OPTIONS进行拦截#xff0c;并返回非200的http状态码。浏览器一律提示为cors error。 一、了解跨域
1.1 同源策略
浏览器的同源策略#xff08;Same-Origin Po…先说明一个坑。在跨域的情况下浏览器针对复杂请求会发起预检OPTIONS请求。如果服务端对OPTIONS进行拦截并返回非200的http状态码。浏览器一律提示为cors error。 一、了解跨域
1.1 同源策略
浏览器的同源策略Same-Origin Policy用于限制网页中的JavaScript代码与来自不同源的资源进行交互。
同源策略的规则包括
协议相同域名或主机地址相同端口相同
下图为是否同源的示例 1.2 跨域资源共享
1.2.1 概念
跨域资源共享Cross-Origin Resource SharingCORS是一种机制为了绕过浏览器的同源策略Same-Origin Policy而设计的它允许网页从不同源域名、协议、端口获取或发送HTTP请求以实现跨域数据交换。
CORS将HTTP请求分为两类如果详细了解请查阅跨域资源共享-W3C
简单请求 请求方式 GETPOSTHEAD 特定的Content-Type值 text/plainmultipart/form-dataapplication/x-www-form-urlencoded 请求头Accept, Accept-Language, Content-Language 预检请求 当浏览器检测到一个跨域请求不符合简单请求的条件时它会自动发送一个预检请求以获得服务器的授权。非简单请求的请求方式非简单请求的Content-Type值非简单请求的请求头
1.2.2 服务器
服务器通过在响应中包含相应的CORS头部来授权或拒绝请求。常见的CORS头部包括
Access-Control-Allow-Origin指定哪些源可以访问资源。Access-Control-Allow-Methods指定允许的HTTP方法。Access-Control-Allow-Headers指定允许的自定义HTTP头部。Access-Control-Allow-Credentials指定是否允许发送凭据如Cookie。Access-Control-Max-Age时间单位为秒。指定预检请求的缓存时间减少后续请求的预检请求次数。
二、SpringBoot示例配置
SpringBoot配置跨域三种方式启动项目进行测试。访问http://127.0.0.1:4321/
源码地址
2.1 局部注解
PostMapping(/annotation)
CrossOrigin
public String annotation() {return 注解实现跨域;
}2.2 第一种全局
/*** 方式一** see a hrefhttps://blog.csdn.net/qq_37651252/article/details/106630443跨域配置方式一/a*/
Bean
public CorsFilter first() {CorsConfiguration config new CorsConfiguration();//允许所有域名进行跨域调用//config.addAllowedOrigin(*);//springboot2不适用该方法config.addAllowedOriginPattern(*);//允许跨越发送cookieconfig.setAllowCredentials(true);//放行全部原始头信息config.addAllowedHeader(*);//允许所有请求方法跨域调用使用大写的方可config.addAllowedMethod(GET);UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration(/**, config);return new CorsFilter(source);
}2.3 第二种全局
/*** 方法二*/
Bean
public FilterRegistrationBean second() {FilterRegistrationBean registrationBean new FilterRegistrationBean();//注入过滤器registrationBean.setFilter((servletRequest, servletResponse, filterChain) - {HttpServletResponse httpServletResponse (HttpServletResponse) servletResponse;httpServletResponse.setHeader(Access-Control-Allow-Origin, *);//响应头设置httpServletResponse.setHeader(Access-Control-Allow-Headers, *);//响应类型httpServletResponse.setHeader(Access-Control-Allow-Methods, *);//允许跨越发送cookiehttpServletResponse.setHeader(Access-Control-Allow-Credentials, true);filterChain.doFilter(servletRequest, servletResponse);});//过滤器名称registrationBean.setName(CrossOrigin);//拦截规则registrationBean.addUrlPatterns(/*);//过滤器顺序registrationBean.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE);return registrationBean;
}2.4 第三种全局
Component
public class SystemWebMvcConfigurer extends WebMvcConfigurationSupport {/*** 跨域配置*/Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping(/**).allowCredentials(true).allowedOriginPatterns(*).allowedHeaders(*).allowedMethods(*);}
}ials(true) .allowedOriginPatterns(““) .allowedHeaders(””) .allowedMethods(“*”); } }