Spring MVC中如何在doFilterInternal内获取@RequestMapping的name属性值?
解决方案
要在doFilterInternal中获取控制器类和方法上的name属性,核心是通过Spring MVC的请求映射元数据实现,具体步骤如下:
- 获取请求对应的处理器执行链:Spring处理请求时会将匹配的处理器信息存入
HttpServletRequest属性,可通过固定属性键取出。 - 判断处理器类型:仅当处理器为
HandlerMethod类型时,才对应控制器方法,此时可提取类和方法的注解信息。 - 提取注解的name属性:分别从类级别的
@RequestMapping和方法级别的@PostMapping/@GetMapping等注解中获取name值。
修改你的JwtAuthenticationFilter代码如下:
@Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JWTServiceImpl jwtServiceImpl; private final UserServiceImpl userServiceImpl; private final GetCookieByName getCookieByName; @Override protected void doFilterInternal( @NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws ServletException, IOException { final String jwtToken; final String refreshToken; final String userEmail; // 获取请求对应的处理器执行链 HandlerExecutionChain handlerChain = (HandlerExecutionChain) request.getAttribute(DispatcherServlet.HANDLER_EXECUTION_CHAIN_ATTRIBUTE); if (handlerChain != null) { Object handler = handlerChain.getHandler(); // 判断是否为控制器方法 if (handler instanceof HandlerMethod handlerMethod) { // 获取类上的@RequestMapping注解的name值 RequestMapping classRequestMapping = handlerMethod.getBeanType().getAnnotation(RequestMapping.class); String className = null; if (classRequestMapping != null) { className = classRequestMapping.name(); } // 获取方法上的映射注解(涵盖PostMapping、GetMapping等) String methodName = null; PostMapping postMapping = handlerMethod.getMethodAnnotation(PostMapping.class); if (postMapping != null) { methodName = postMapping.name(); } else { GetMapping getMapping = handlerMethod.getMethodAnnotation(GetMapping.class); if (getMapping != null) { methodName = getMapping.name(); } // 可按需添加PutMapping、DeleteMapping等其他注解的判断 } // 组合结果,按需使用 if (className != null && methodName != null) { String fullName = className + "." + methodName; // 格式如cNameA.nameA // 这里可以将fullName存入request属性或直接使用 } else if (methodName != null) { // 至少拿到方法的name值 } } } // 原有逻辑继续执行 filterChain.doFilter(request, response); } }
注意事项
- 静态资源、Actuator端点等非控制器请求不会返回
HandlerMethod,需做非空判断避免空指针。 - 若控制器方法使用其他请求映射注解(如
PutMapping),需补充对应的注解判断逻辑。 - 确保引入Spring MVC相关依赖,
DispatcherServlet和HandlerMethod属于org.springframework.web.servlet包。
内容的提问来源于stack exchange,提问作者Mr. Kenneth
相关产品推荐
相关产品推荐

