过滤器拦截器conterller顺序
时间: 2025-02-01 10:48:46 浏览: 37
### Spring MVC 中 Filter、Interceptor 和 Controller 的执行顺序
在Spring MVC应用程序中,`Filter`、`Interceptor`以及`Controller`按照特定的顺序被调用来处理HTTP请求。以下是具体的执行流程:
#### 请求到达前
- **Filter**:作为最外层防护机制,位于容器级别,在任何其他组件之前工作。每当有客户端发起请求时,都会先经过这里[^2]。
```java
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
System.out.println("Before processing by filter");
chain.doFilter(req, res);
System.out.println("After processing by filter");
}
}
```
#### 进入Spring MVC内部后
- **Pre Interceptor (`preHandle`)**
- 接下来是`HandlerMapping`找到对应的处理器适配器(`HandlerAdapter`)之后,会触发拦截器链的第一个方法即`preHandle()`。此阶段允许开发者做些准备工作比如权限验证等操作,并可决定是否阻止后续逻辑继续运行[^4]。
```java
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
if (!uri.startsWith("/login") && !isUserLoggedIn(request)) { // 假设这是一个简单的登录状态检查函数
response.sendRedirect("/login");
return false;
} else {
return true;
}
}
private boolean isUserLoggedIn(HttpServletRequest request){
HttpSession session=request.getSession(false);
return session!=null&&session.getAttribute("user")!=null;
}
}
```
- **Controller Action Method Execution**: 如果所有的前置条件都被满足,则进入实际业务逻辑所在的控制器方法内执行相应的动作[^1]。
```java
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.findById(id);
if(user != null){
return new ResponseEntity<>(user, HttpStatus.OK);
}else{
throw new ResourceNotFoundException("Not found!");
}
}
}
```
#### 返回响应给客户端过程中
- **Post Interceptor (`postHandle`, `afterCompletion`)**
- 控制器完成其职责并准备发送视图或数据回前端之时,会依次回调已注册过的各拦截器实例上的`postHandle()`方法用于修改ModelAndView对象或是记录日志等活动;而一旦整个过程顺利结束无异常抛出的话还会再走一遍`afterCompletion()`以便清理资源等工作。
```java
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
```
- **Finally Filter Chain Completion**: 当所有上述步骤完成后,控制权最终交回到最初的过滤器链条处去完成最后几步如设置响应头之类的工作直至完全关闭连接为止。
综上所述,在一次完整的Web请求生命周期里,`Filter -> Pre Interceptor(preHandle()) -> Controller Action Method -> Post Interceptor(postHandle(), afterCompletion()) -> Finally Filter Chain Completion`构成了标准的执行路径。
阅读全文
相关推荐
















