You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中如何在doFilterInternal内获取@RequestMapping的name属性值?

解决方案

要在doFilterInternal中获取控制器类和方法上的name属性,核心是通过Spring MVC的请求映射元数据实现,具体步骤如下:

  1. 获取请求对应的处理器执行链:Spring处理请求时会将匹配的处理器信息存入HttpServletRequest属性,可通过固定属性键取出。
  2. 判断处理器类型:仅当处理器为HandlerMethod类型时,才对应控制器方法,此时可提取类和方法的注解信息。
  3. 提取注解的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:27:02