项目场景:
使用90版本之后的谷歌浏览器, 在部署前端项目后, 调用后端接口出现 strict-origin-when-cross-origin, 并且静态资源被拦截的情况
问题描述:
使用90版本之后的谷歌浏览器, 在部署前端项目后, 访问前端页面调用后端接口出现 strict-origin-when-cross-origin.
接口返回200, 但是没有响应结果, 如下图所示
原因分析:
Chrome 计划在85版开始 将其切换默认策略 no-referrer-when-downgrade 更换到 strict-origin-when-cross-origin. strict-origin-when-cross-origin对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP).
解决方案:
后端程序配置全局跨域访问配置
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author
*
* 跨域访问配置
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
}
补充
1. 代码不全
其实解决跨域问题的代码就这么多, 其他的实现WebMvcConfigurer 接口的方法可以直接不进行处理,
直接使用默认的方法直接实现即可. 下面是本人使用的FilterConfig 类的完整代码
@Configuration
public class FilterConfig implements WebMvcConfigurer {
/**
* token验证拦截器
*/
@Autowired
private TokenFilter tokenFilter;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// token验证拦截器
registry.addInterceptor(tokenFilter)
// 拦截的路径
.addPathPatterns("/**")
// 排除的路径
.excludePathPatterns("/test");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String os = System.getProperty("os.name");
/*生产时删除相关判断 直接通过yml区分环境来实现文件路径的切换*/
//如果是Windows系统
if (os.toLowerCase().startsWith("win")) {
registry.addResourceHandler("/upload/**").addResourceLocations("file:d:/upload/");
} else { //linux 和mac
registry.addResourceHandler("/upload/**").addResourceLocations("file:/home/upload/");
}
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH", "OPTIONS")
.maxAge(3600);
}
}
2. 关于请求没到后端就被跨域拦截了
大概率是在Nginx层面被拦截了, 需要在Nginx转发后的地方加上请求头
location /mis/ {
proxy_pass http://172.17.0.1:23456;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' '*';
}