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

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

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

最开始的时候,换了很多种跨域配置都不行,实在想不到什么原因,后来想到之前使用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();
        		})
        		;
    }

}

你可能感兴趣的:(SpringBoot,sa-token,spring,boot,后端,java)