WebMvcConfigurer 自定义一个注解来实现是否过滤
时间: 2024-05-06 10:15:49 浏览: 92
首先需要创建一个注解:
```
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FilterRequired {
boolean value() default true;
}
```
这个注解只有一个 boolean 类型的属性 value,用来标识是否需要过滤。
接下来在实现 WebMvcConfigurer 接口的类中重写 addInterceptors 方法,通过该方法为 Controller 中使用了 FilterRequired 注解的方法添加拦截器:
```
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**")
.excludePathPatterns("/login").excludePathPatterns("/register")
.excludePathPatterns("/error").excludePathPatterns("/static/**")
.excludePathPatterns("/favicon.ico")
.excludePathPatterns(getExcludePathPatterns());
registry.addInterceptor(filterInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/login").excludePathPatterns("/register")
.excludePathPatterns("/error").excludePathPatterns("/static/**")
.excludePathPatterns("/favicon.ico")
.excludePathPatterns(getExcludePathPatterns())
.excludePathPatterns(getExcludeFilterPathPatterns());
}
private FilterInterceptor filterInterceptor() {
return new FilterInterceptor();
}
private List<String> getExcludeFilterPathPatterns() {
List<String> excludePathPatterns = new ArrayList<>();
for (Method method : getClass().getDeclaredMethods()) {
if (method.isAnnotationPresent(FilterRequired.class)) {
FilterRequired filterRequired = method.getAnnotation(FilterRequired.class);
if (!filterRequired.value()) {
String pathPattern = getPathPattern(method);
excludePathPatterns.add(pathPattern);
}
}
}
return excludePathPatterns;
}
private String getPathPattern(Method method) {
RequestMapping requestMapping = AnnotationUtils.findAnnotation(method, RequestMapping.class);
if (requestMapping != null && requestMapping.value().length > 0) {
return requestMapping.value()[0];
}
return null;
}
}
```
其中,filterInterceptor() 方法返回 FilterInterceptor 类的实例,用于实现具体的拦截逻辑。getExcludeFilterPathPatterns() 方法用于获取所有使用了 FilterRequired 注解且 value 值为 false 的方法所对应的请求路径,从而将这些请求路径排除在拦截器的拦截范围之外。getPathPattern() 方法用于获取方法上使用的 RequestMapping 注解中的请求路径。
最后,在 Controller 中需要过滤的方法上添加 FilterRequired 注解,并设置其 value 值为 true 或 false,如下所示:
```
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
@FilterRequired(false)
public Result login(@RequestBody User user) {
User userResult = userService.login(user.getUsername(), user.getPassword());
if (userResult != null) {
return Result.success(userResult);
} else {
return Result.error("用户名或密码错误");
}
}
}
```
这样就可以通过自定义注解来实现是否过滤的功能了。
阅读全文