温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java拦截器如何传参

发布时间:2026-10-08 03:21:06 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 Java 里,“拦截器”常见于 Spring MVC 的 HandlerInterceptor 或 MyBatis 的 Interceptor,不同场景传参方式不一样。下面以最常用、最容易混淆的 Spring MVC 拦截器为主说明,并补充 MyBatis 场景。


一、Spring MVC 拦截器(HandlerInterceptor)如何传参

1️⃣ 通过 preHandle 方法的参数(最常用)

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) {
        // 从请求中获取参数
        String token = request.getHeader("token");
        String id = request.getParameter("id");
        return true;
    }
}

✅ 适合:

  • URL 参数
  • Header
  • Cookie
  • Session

2️⃣ 通过 request.setAttribute 传递(拦截器 → Controller)

request.setAttribute("userId", 123);

Controller 中:

@GetMapping("/test")
public void test(HttpServletRequest request) {
    Object userId = request.getAttribute("userId");
}

✅ 或结合 @RequestAttribute

public void test(@RequestAttribute("userId") Integer userId)

3️⃣ 通过 ThreadLocal 在拦截器中传参(推荐用于用户信息)

public class UserContext {
    private static final ThreadLocal<Integer> USER = new ThreadLocal<>();

    public static void set(Integer id) {
        USER.set(id);
    }

    public static Integer get() {
        return USER.get();
    }

    public static void clear() {
        USER.remove();
    }
}

拦截器:

UserContext.set(123);

Controller / Service:

Integer userId = UserContext.get();

⚠️ 记得在 afterCompletion 中 clear


4️⃣ 通过 注册拦截器时传构造参数(配置级参数)

public class MyInterceptor implements HandlerInterceptor {
    private String env;

    public MyInterceptor(String env) {
        this.env = env;
    }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor("prod"));
    }
}

✅ 适合:

  • 环境参数
  • 开关配置

5️⃣ 通过 Spring Bean 注入参数(推荐)

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Autowired
    private UserService userService;
}

二、MyBatis 拦截器如何传参(Executor / Statement)

@Intercepts({...})
public class MyPlugin implements Interceptor {

    private String param;

    public MyPlugin(String param) {
        this.param = param;
    }

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 使用 param
        return invocation.proceed();
    }
}

三、总结对照表

场景 推荐方式
请求参数 HttpServletRequest
用户信息 ThreadLocal
配置参数 构造方法 / @Value
跨层传递 request.setAttribute
拦截器之间 request 或 ThreadLocal

如果你指的是 Spring Security、Feign、Sentinel、Dubbo、OKHttp 等具体拦截器,可以告诉我,我可以给你对应示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手