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;
    }
}

posted on 2022-07-14 18:00  疯狂的妞妞  阅读(761)  评论(0编辑  收藏  举报

导航