“拦截器参数如何获取”要看具体技术栈,不同框架里“拦截器”概念和取值方式不一样。下面把常见场景分别说明,你可以按需对照;如果还不是你用的,可以直接告诉我框架名。
Spring 的 HandlerInterceptor 没有直接的“参数对象”,参数通常来自:
HttpServletRequestHandlerMethodModelAndViewpublic class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 1. 路径参数(/user/{id})
String uri = request.getRequestURI();
// 2. 查询参数(?name=xxx)
String name = request.getParameter("name");
// 3. Header
String token = request.getHeader("Authorization");
// 4. 获取 controller 方法参数(需要 HandlerMethod)
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
Method method = hm.getMethod();
}
return true;
}
}
✅ 重点:
Spring MVC 的参数(方法参数)在拦截器阶段还没被解析,只能通过 request 或反射获取方法信息。
public class MyFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange,
WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String param = request.getQueryParams().getFirst("name");
return chain.filter(exchange);
}
}
MyBatis 的拦截器是插件机制,参数来自 Invocation。
@Intercepts({
@Signature(type = Executor.class,
method = "update",
args = {MappedStatement.class, Object.class})
})
public class MyBatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object[] args = invocation.getArgs();
MappedStatement ms = (MappedStatement) args[0];
Object parameterObject = args[1]; // mapper 方法参数
return invocation.proceed();
}
}
✅ parameterObject 就是你的 mapper 参数(可能是一个对象或 Map)
public class MyDubboFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) {
String methodName = invocation.getMethodName();
Object[] args = invocation.getArguments();
return invoker.invoke(invocation);
}
}
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String param = httpRequest.getParameter("id");
chain.doFilter(request, response);
}
}
| 场景 | 参数来源 |
|---|---|
| Spring MVC 拦截器 | HttpServletRequest |
| Controller 方法参数 | 拦截器阶段无法直接获取 |
| MyBatis 拦截器 | Invocation.getArgs() |
| Dubbo | Invocation.getArguments() |
| Filter | ServletRequest |
你可以直接告诉我:
我可以直接给你可运行的代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。