SpringBoot 使用 Sa

时间: 2023-12-21 admin 维修知识

SpringBoot 使用 Sa

SpringBoot 使用 Sa

SpringBoot 使用 Sa-Token 的全局过滤器解决跨域问题

  • 最开始的时候,换了很多种跨域配置都不行,实在想不到什么原因,后来想到之前使用Shiro框架的时候,也需要额外的处理Shiro导致的跨域问题,我马上打开sa-token官网一查,好家伙,果然Sa-Token也需要额外单独配置跨域
    • 方式一,跨域禁止cookie传递
    • 方式二,官网配置

最开始的时候,换了很多种跨域配置都不行,实在想不到什么原因,后来想到之前使用Shiro框架的时候,也需要额外的处理Shiro导致的跨域问题,我马上打开sa-token官网一查,好家伙,果然Sa-Token也需要额外单独配置跨域

方式一,跨域禁止cookie传递

适合 前后端分离,并且使用 head头的 token 参数来鉴权的场景

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration corsConfig = new CorsConfiguration();corsConfig.addAllowedOrigin("*"); // 允许所有来源corsConfig.addAllowedMethod("*"); // 允许所有HTTP方法corsConfig.addAllowedHeader("*"); // 允许所有HTTP标头// 项目使用了 sa-token,并且是使用 token 前后端分离的方式,并不是使用 cookies传递用户token,所以要设置为falsecorsConfig.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 全局过滤器] */@Beanpublic 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();});}}