在 Java 里,“拦截器”常见于 Spring MVC 的 HandlerInterceptor 或 MyBatis 的 Interceptor,不同场景传参方式不一样。下面以最常用、最容易混淆的 Spring MVC 拦截器为主说明,并补充 MyBatis 场景。
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;
}
}
✅ 适合:
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)
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
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"));
}
}
✅ 适合:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
}
@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 等具体拦截器,可以告诉我,我可以给你对应示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。