发布于2026-07-15 阅读(0)
扫一扫,手机访问
在`preHandle`中需先判断`handler`是否为`HandlerMethod`类型,再通过`getMethod()`获取`Method`对象读取注解;若需类级注解,则用`getBeanType()`获取Controller类。

在`preHandle`方法里,要拿到目标处理器方法(也就是`HandlerMethod`)上的注解,核心思路其实很直接:先把`handler`参数安全地转换成`HandlerMethod`类型,然后通过它提供的`getMethod()`或`getBeanType()`等方法拿到反射对象,接着就能像平常读注解一样操作了。
`preHandle`的第二个参数`handler`类型是`Object`,Spring MVC只有匹配到控制器方法时才传进来一个`HandlerMethod`实例。如果是静态资源、错误页或者自定义的`Handler`,那传入的可能就不是这个类型了。所以,一定要先做类型判断,不然直接强转就会抛出`ClassCastException`。常规做法是用`if (handler instanceof HandlerMethod)`来安全判断,如果不满足条件,直接返回`true`(放行)或者按业务需要处理即可。
确认类型后,通过`((HandlerMethod) handler).getMethod()`就能拿到底层的`ja va.lang.reflect.Method`对象,然后就可以用标准的反射API来读取注解了。常用的几种方式:
有时候还需要检查类级别的注解,比如`@RequestMapping`或`@RestController`。这时候就不能用`getMethod()`了,得通过`((HandlerMethod) handler).getBeanType()`拿到控制器类的`Class`对象,再调用`getAnnotation()`:
下面是一个典型的写法,在`preHandle`里安全地获取`@GetMapping`和自定义的`@NeedAuth`注解:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); // 获取方法上的 @NeedAuth 注解 NeedAuth needAuth = method.getAnnotation(NeedAuth.class); if (needAuth != null && needAuth.required()) { // 执行鉴权逻辑 } // 检查是否是 GET 请求(也可用 @GetMapping 判断) if (method.isAnnotationPresent(GetMapping.class)) { // 处理 GET 相关逻辑 } } return true;}
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8