在 Java 里,“拦截器”通常指 Servlet Filter、Spring Interceptor、MyBatis Interceptor、Dubbo Filter 等。下面以**最常见、最容易被问到的 Spring 拦截器(HandlerInterceptor)**为主,顺便补充 Filter 和单元测试方法。
| 类型 | 典型场景 | 测试重点 |
|---|---|---|
| Servlet Filter | 请求最外层(字符集、日志、鉴权) | 请求/响应是否被正确处理 |
| Spring HandlerInterceptor | Controller 前后 | 登录校验、权限、日志 |
| MyBatis Interceptor | SQL 执行前后 | SQL 改写、分页 |
| Dubbo Filter | RPC 调用 | 链路追踪、限流 |
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("token");
if (token == null) {
response.setStatus(401);
return false;
}
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**");
}
}
@SpringBootTest
@AutoConfigureMockMvc
class LoginInterceptorTest {
@Autowired
MockMvc mockMvc;
@Test
void shouldRejectWhenNoToken() throws Exception {
mockMvc.perform(get("/user/info"))
.andExpect(status().isUnauthorized());
}
@Test
void shouldPassWithToken() throws Exception {
mockMvc.perform(get("/user/info")
.header("token", "abc"))
.andExpect(status().isOk());
}
}
✅ 优点
class LoginInterceptorUnitTest {
@Test
void preHandle_shouldReturnFalseWhenNoToken() throws Exception {
LoginInterceptor interceptor = new LoginInterceptor();
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
boolean result = interceptor.preHandle(
request, response, new Object());
assertFalse(result);
assertEquals(401, response.getStatus());
}
}
✅ 优点
@WebFilter("/*")
public class LogFilter implements Filter {
public void doFilter(...) {
// 日志逻辑
chain.doFilter(request, response);
}
}
mockMvc.perform(get("/test"))
.andExpect(status().isOk());
或用 MockFilterChain 单元测试。
@Intercepts({@Signature(type = Executor.class,
method = "update", args = {MappedStatement.class, Object.class})})
public class SqlInterceptor implements Interceptor {
}
✅ 测试方式
如果你能告诉我:
我可以直接给你对应可运行的测试代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。