想象一下,你正在指挥一场复杂的交响乐演出。作为指挥家,你需要在乐曲演奏过程中,精准地控制每个声部的演奏时机和节奏变化。在软件开发领域,Interceptor 就像一位经验丰富的指挥家,它能够在不改变程序原有结构的情况下,灵活地拦截程序的执行流程,并在关键节点插入额外的处理逻辑,就像指挥家在乐谱上添加一些精妙的装饰音,让程序的演奏更加优雅动听。
在 Web 应用中,用户的请求就像一张张乐谱,而 Controller 方法则是演奏乐曲的各个声部。Interceptor 就像一位掌控全局的指挥家,它能够拦截住用户的每一个请求,并在请求到达目标 Controller 方法之前或之后,执行一些预先安排好的动作,例如检查用户是否登录、记录请求日志、修改请求参数等等。
虽然 Interceptor 和 Filter 都可以拦截请求,但它们就像指挥家和舞台监督一样,负责不同的工作:
Spring MVC Interceptor 提供了三个核心方法,就像指挥家的指挥棒一样,可以灵活地控制程序的执行流程:
简而言之:
1.preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行
2.postHandle方法:目标资源方法执行后执行
3.afterCompletion方法:视图渲染完毕后执行,最后执行
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 预处理逻辑,例如打印请求路径
System.out.println("Interceptor - preHandle: " + request.getRequestURI());
// 执行权限检查逻辑...
boolean hasPermission = checkPermission(request);
if (!hasPermission) {
// 如果没有权限,设置响应状态码为403,并返回false阻止请求继续执行
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
return false;
}
// 返回 true,表示放行,继续执行下一个拦截器或目标 Controller 方法
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 后处理逻辑,例如添加模型数据
System.out.println("Interceptor - postHandle");
if (modelAndView != null) {
modelAndView.addObject("message", "来自拦截器的问候!");
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 资源清理、记录响应日志等操作
System.out.println("Interceptor - afterCompletion");
}
// 模拟权限检查方法
private boolean checkPermission(HttpServletRequest request) {
// ... 检查用户是否具有访问权限 ...
return true;
}
}
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 设置拦截路径,例如拦截所有请求
.excludePathPatterns("/login", "/register"); // 设置排除路径,例如排除登录和注册请求
}
}
<mvc:interceptors>
<bean class="com.example.MyInterceptor">
<property name="mappedPatterns">
<list>
<value>/**</value> <!-- 设置拦截路径 -->
</list>
</property>
<property name="excludedPatterns">
<list>
<value>/login</value> <!-- 设置排除路径 -->
<value>/register</value>
</list>
</property>
</bean>
</mvc:interceptors>
假设我们正在开发一个电商网站,用户需要登录才能进行下单操作。为了保证网站安全,我们需要使用 Interceptor 对所有下单请求进行拦截,检查用户是否登录,如果未登录,则跳转到登录页面。
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取用户信息
User user = (User) request.getSession().getAttribute("user");
// 判断用户是否登录
if (user == null) {
// 未登录,跳转到登录页面
response.sendRedirect("/login");
return false; // 拦截请求
}
// 已登录,放行请求
return true;
}
}
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/order/**"); // 拦截所有以 /order/ 开头的请求
}
}
Interceptor 是构建灵活、可扩展 Web 应用的利器,它能够帮助我们优雅地处理横切关注点,提高代码复用性,降低系统耦合度。掌握 Interceptor 的使用,能够让我们开发出更加健壮、易于维护的 Web 应用,就像一位经验丰富的指挥家,能够指挥乐团演奏出美妙动听的乐章。
以上就是关于拦截器Interceptor的详解,希望对各位有所帮助,感谢各位看官的观看,谢谢~