SpringBoot 使用 Sa-Token 的全局过滤器解决跨域问题
最开始的时候,换了很多种跨域配置都不行,实在想不到什么原因,后来想到之前使用Shiro框架的时候,也需要额外的处理Shiro导致的跨域问题,我马上打开sa-token官网一查,好家伙,果然Sa-Token也需要额外单独配置跨域
方式一,跨域禁止cookie传递
适合 前后端分离,并且使用 head
头的 token
参数来鉴权的场景
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.addAllowedOrigin("*"); // 允许所有来源
corsConfig.addAllowedMethod("*"); // 允许所有HTTP方法
corsConfig.addAllowedHeader("*"); // 允许所有HTTP标头
// 项目使用了 sa-token,并且是使用 token 前后端分离的方式,并不是使用 cookies传递用户token,所以要设置为false
corsConfig.setAllowCredentials(false); // 允许携带身份信息(如Cookies)
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig);
return new CorsFilter(source);
}
}
方式二,官网配置
官网教程:Sa-Token跨域问题
/**
* [Sa-Token 权限认证] 配置类
*
*/
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
/**
* 注册 [Sa-Token 全局过滤器]
*/
@Bean
public SaServletFilter getSaServletFilter() {
return new SaServletFilter()
// 指定 [拦截路由] 与 [放行路由]
.addInclude("/**").addExclude("/favicon.ico")
// 认证函数: 每次请求执行
.setAuth(obj -> {
SaManager.getLog().debug("----- 请求path={} 提交token={}", SaHolder.getRequest().getRequestPath(), StpUtil.getTokenValue());
// ...
})
// 异常处理函数:每次认证函数发生异常时执行此函数
.setError(e -> {
return SaResult.error(e.getMessage());
})
// 前置函数:在每次认证函数之前执行
.setBeforeAuth(obj -> {
SaHolder.getResponse()
// ---------- 设置跨域响应头 ----------
// 允许指定域访问跨域资源
.setHeader("Access-Control-Allow-Origin", "*")
// 允许所有请求方式
.setHeader("Access-Control-Allow-Methods", "*")
// 允许的header参数
.setHeader("Access-Control-Allow-Headers", "*")
// 有效时间
.setHeader("Access-Control-Max-Age", "3600")
;
// 如果是预检请求,则立即返回到前端
SaRouter.match(SaHttpMethod.OPTIONS)
.free(r -> System.out.println("--------OPTIONS预检请求,不做处理"))
.back();
})
;
}
}