同源策略
Same Origin Policy,译为“同源策略”,它是对于客户端脚本(尤其是JavaScript)的重要安全度量标准。
即:具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。
解决方法CORS
CORS是"跨域资源共享”(Cross-origin resource sharing)。它允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出HttpRequest请求。
Spring Boot解决方式
方式一:实现WebMvcConfigurer,添加访问映射(类似添加拦截器)
/**
* @Author: xiang
* @Date: 2021/5/7 21:06
*/
@Configuration
@ComponentScan(basePackages = "com.neuq.common") //全局异常处理类需要被扫描才能用
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 添加访问映射 解决跨域问题
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
// 添加映射路径
registry.addMapping("/**")
// 放行哪些原始域
.allowedOriginPatterns("*")
// 是否发送Cookie信息
.allowCredentials(true)
// 放行哪些原始域(请求方式)
.allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS", "HEAD")
// 放行哪些原始域(头部信息)
.allowedHeaders("*")
// 客户端缓存请求数据时长(单位s,默认30min)
.maxAge(3600)
// 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
.exposedHeaders("Server","Content-Length", "Authorization", "Access-Token", "Access-Control-Allow-Origin","Access-Control-Allow-Credentials");
}
}
方法二:过滤器方式
@WebFilter(filterName = "CorsFilter ")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
chain.doFilter(req, res);
}
}
拓展OPTIONS问题
OPTIONS:"预检"请求(preflight):
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
注意:OPTIONS并不包含真正的请求信息
拦截器中放行OPTIONS就行:
//如果是方法探测,直接通过("预检"请求 并不会包含真正的请求数据)
if (HttpMethod.OPTIONS.equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return true;
}