拦截器/(过滤器)的概念和用途
时间: 2025-06-30 21:05:53 浏览: 10
### 拦截器与过滤器的概念
拦截器(Interceptor)和过滤器(Filter)是 Web 开发中两种重要的组件,主要用于对 HTTP 请求进行预处理、后处理以及其他附加操作。两者虽然功能相似,但在实现机制、适用范围等方面存在显著差异。
#### 拦截器
拦截器是一种基于框架层面的技术,通常依赖于具体的开发框架(如 Spring MVC)。其核心思想是对某些特定的请求或业务逻辑进行拦截,并在其前后执行相应的逻辑[^5]。拦截器的主要特点如下:
- **实现方式**:拦截器通常通过实现特定接口(如 Spring 中的 `HandlerInterceptor` 接口)来定义行为。
- **触发条件**:拦截器仅针对框架内的请求生效,例如 Spring MVC 的控制器方法调用。
- **灵活性**:由于拦截器紧密集成到框架内部,因此能够获取更多上下文信息(如模型对象、视图名称等)。
#### 过滤器
过滤器则是 Servlet 规范的一部分,属于容器级别的技术。它可以在任何阶段对所有类型的请求进行干预[^2]。以下是过滤器的关键特性:
- **实现方式**:过滤器通过重写 `doFilter()` 方法完成请求的处理,其实现基于回调函数。
- **触发条件**:过滤器适用于更广泛的场景,它可以拦截所有的 HTTP 请求,无论这些请求是否涉及框架的具体功能。
- **性能影响**:相比拦截器,过滤器可能会带来更大的开销,因为它作用于更低层次的请求链路。
---
### 拦截器与过滤器的作用
无论是拦截器还是过滤器,在实际应用中都可以承担多种职责,主要包括但不限于以下几类:
1. **权限控制**
- 验证用户身份合法性,防止未经授权的访问。
- 示例代码展示如何在过滤器中实现基本的身份验证:
```java
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String authHeader = httpRequest.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Missing or invalid token");
return;
}
// Token validation logic here...
chain.doFilter(request, response); // Continue processing the request
}
```
2. **日志记录**
- 记录每次请求的相关细节,便于调试和监控系统运行状况。
- 利用拦截器记录请求参数及响应时间的例子:
```java
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
log.info("Start time: {}", startTime);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
log.info("End Time: {}, Execution Time: {} ms", endTime, (endTime - startTime));
}
```
3. **数据转换**
- 修改传入的数据格式或将结果封装成指定形式再返回给客户端。
- 下面是一个简单的 JSON 响应包装示例:
```java
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (modelAndView != null && modelAndView.getViewName().startsWith("json")) {
Map<String, Object> modelMap = modelAndView.getModel();
JsonNode jsonResult = objectMapper.valueToTree(modelMap.get("data"));
modelAndView.addObject("formattedJson", jsonResult.toString());
}
}
```
4. **异常捕获**
- 统一处理可能出现的各种错误情况并向外部暴露友好的提示消息。
- 自定义全局异常处理器结合过滤器使用的情形:
```java
try {
chain.doFilter(request, response);
} catch (Exception e) {
((HttpServletResponse)response).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "An unexpected error occurred.");
}
```
---
### 使用场景分析
| 特性/对比维度 | 拦截器 | 过滤器 |
|----------------|-------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------|
| 出身 | 属于具体框架(如 Spring MVC),需配合框架使用 | 是 Java EE 标准 API 的一部分 |
| 触发时机 | 主要在框架层面对 Controller 或 Handler 执行前后的动作 | 在整个 Servlet 生命周期内均可介入 |
| 实现难度 | 较高,需要熟悉所选框架的设计理念 | 相对简单,只需按照标准模板扩展即可 |
| 支持项目类型 | 更适合现代化轻量级微服务架构 | 广泛应用于传统单体应用 |
---
###
阅读全文
相关推荐



















