springboot2 - 跨域配置
同源策略是浏览器的一个安全限制,要求域名、协议、端口相同,如果不同则没办法进行数据交互。
而跨域配置,则是为了解除这方面的限制。
前后端分离的情况下,如果前后端分开部署,基本都需要进行跨域配置了。
(在 nginx 上也可以处理,不过这里就不对 nginx 展开讨论了)
配置选项简介
- Access-Control-Allow-Origin: 允许访问的域名
- Access-Control-Allow-Methods: 允许访问的请求方式
- Access-Control-Allow-Headers: 允许使用的 Header
- Access-Control-Allow-Credentials: 是否允许用户发送、处理 Cookie
- Access-Control-Max-Age: 预检有效期,单位为秒。有效期内,不需要重复发送预检请求
- Access-Control-Expose-Headers: Header 白名单,不设置的话,客户端读不到 Header 的内容
配置单个跨域
@Configuration
public class CrossDomainStarter {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.addExposedHeader("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
corsConfigurationSource.registerCorsConfiguration("/**",config);
return new CorsFilter(corsConfigurationSource);
}
}
配置多个跨域
注意函数名 addAllowedOrigin(),是 add 而不是 set,这些参数本身就可以配置多个。
配置更多跨域
如果需要非常复杂的跨域配置,那还不如直接放开跨域拦截,通过鉴权系统进行控制。
话虽如此,就是想在跨域上搞事情,强行实现一波,应当如何?
我们要实现 CorsConfigurationSource 接口,前面的代码中,UrlBasedCorsConfigurationSource 就是其中一个实现类,
CorsConfigurationSource 相当于 Dao,参数是 request,根据 request 的内容查找对应的跨域配置。
可以把 UrlBasedCorsConfigurationSource 的源码照抄一份,照着自己的需求改一改。
下面提供一份伪代码:
class Demo implements CorsConfigurationSource{
@Override
@Nullable
public CorsConfiguration getCorsConfiguration(@NotNull HttpServletRequest request) {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
// 获取请求来源
String origin = request.getHeader(HttpHeaders.ORIGIN);
// TODO: 根据客户端请求信息,查找CorsConfiguration配置
return null;
}
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!