package com.tcm.training.admin.config; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.stp.StpUtil; import com.tcm.training.admin.common.xss.XssParamInterceptor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.io.File; @Configuration public class SaTokenWebConfig implements WebMvcConfigurer { private final XssParamInterceptor xssParamInterceptor; @Value("${app.upload.dir:uploads}") private String uploadDir; @Value("${app.upload.path-prefix:/uploads}") private String pathPrefix; public SaTokenWebConfig(XssParamInterceptor xssParamInterceptor) { this.xssParamInterceptor = xssParamInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaInterceptor(handle -> { if ("OPTIONS".equalsIgnoreCase(SaHolder.getRequest().getMethod())) { return; } StpUtil.checkLogin(); })) .addPathPatterns("/api/**", "/api/v1/**") .excludePathPatterns( "/api/auth/login", "/api/auth/captcha", "/api/app-version-settings/check", "/api/v1/app-version-settings/check" ); registry.addInterceptor(xssParamInterceptor) .addPathPatterns("/api/**", "/api/v1/**"); } /** 将本地上传目录映射为静态资源,可通过 /uploads/** 访问 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 转为绝对路径,确保 file: 协议正确 String absPath = new File(uploadDir).getAbsolutePath(); registry.addResourceHandler(pathPrefix + "/**") .addResourceLocations("file:" + absPath + "/"); } }