sa-token配置corsconfig
时间: 2025-01-09 20:20:53 浏览: 5
### sa-token 中 CORS 设置
为了在 sa-token 中配置跨域资源共享(CORS),可以采用多种方式来满足不同应用场景的需求。通常情况下,在 Spring Boot 应用中集成 sa-token 时,可以通过全局过滤器或特定端点的方式来进行 CORS 配置。
#### 方法一:通过 WebMvcConfigurer 实现全局 CORS 支持
如果希望为整个应用程序提供统一的 CORS 策略,则可以在 `@Configuration` 类中实现 `WebMvcConfigurer` 接口并重写相应方法:
```java
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 对所有路径生效
.allowedOrigins("*") // 允许来自任何源的请求
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
```
这种方法适用于大多数情况下的简单跨域需求[^2]。
#### 方法二:针对单个控制器或接口单独设置 CORS 属性
对于某些特殊场景下仅需对部分 API 开启 CORS 功能的情况,可以直接在 Controller 或者具体 Handler 上添加 `@CrossOrigin` 注解:
```java
@RestController
@RequestMapping("/api/v1")
@CrossOrigin(origins = {"http://example.com"}, maxAge = 3600, methods={RequestMethod.GET})
public class MyController {
@GetMapping("/data")
public ResponseEntity<String> getData() {
return new ResponseEntity<>("Data from server.", HttpStatus.OK);
}
}
```
此法灵活性较高,适合细粒度控制各个资源之间的访问策略。
#### 方法三:利用 Sa-Token 自带功能处理预检请求
当涉及到更复杂的业务逻辑时,比如动态调整允许的 Origins 列表或是根据用户角色决定是否放行等操作,sa-token 提供了一种优雅的方式来拦截 OPTIONS 请求,并在此基础上做进一步判断:
```java
import cn.dev33.satoken.interceptor.SaInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Configuration
public class SaTokenConfigure {
private final List<String> allowedOrigins = Arrays.asList(
"http://localhost:8080",
"https://yourdomain.com"
);
/**
* Register the interceptor to handle preflight requests.
*/
public void registerInterceptors(InterceptorRegistry registry){
InterceptorRegistration ir = registry.addInterceptor(new SaInterceptor());
// Customize your rules here...
ir.addPathPatterns("/**");
ir.excludePathPatterns("/login");
// Handle Preflight Requests
ir.addPathPatterns("/").addHandlerMethod(this::handlePreflightRequest);
}
private boolean handlePreflightRequest(HttpServletRequest request, HttpServletResponse response) throws IOException{
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
String originHeader = request.getHeader("Origin");
if (originHeader != null && allowedOrigins.contains(originHeader)) {
response.setHeader("Access-Control-Allow-Origin", originHeader);
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
response.setStatus(HttpServletResponse.SC_OK);
return true;
} else {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Origin Header.");
return false;
}
}
return false;
}
}
```
上述代码片段展示了如何借助 sa-token 的拦截机制捕获所有的 HTTP 请求,并特别关注于 OPTIONS 类型的预检请求。这样做的好处是可以集中管理跨域规则而不必修改原有业务逻辑[^1]。
阅读全文