在Spring Boot中,过滤器(Filter)、拦截器(Interceptor)和AOP(面向切面编程)都用于在应用程序的不同层之间添加通用的逻辑处理,但它们有不同的应用场景和实现方式:
- 过滤器(Filter):
- 应用场景:用于处理HTTP请求和响应,可以在Servlet前后处理请求和响应。
- 实现方式:实现javax.servlet.Filter接口。
- 使用:在Spring Boot应用中通过@WebFilter注解或者在application配置中注册。
- 执行顺序:按照注册或代码顺序执行。
- 拦截器(Interceptor):
- 应用场景:用于Spring MVC的Controller层,可以在Controller方法前后处理请求和响应。
- 实现方式:实现org.springframework.web.servlet.HandlerInterceptor接口。
- 使用:通过实现WebMvcConfigurer接口,并重写addInterceptors方法添加拦截器。
- 执行顺序:按照注册或代码顺序执行。
- AOP(Aspect-Oriented Programming):
- 应用场景:用于处理非web请求的业务逻辑,如服务层、数据访问层等。
- 实现方式:使用AspectJ的注解或者XML配置。
- 使用:通过@Aspect注解标注一个类,并使用@Before、@After、@Around等注解标注方法。
- 执行顺序:根据切点定义和@Order注解指定的顺序执行。
示例代码:
过滤器(Filter):
@WebFilter(filterName = "exampleFilter", urlPatterns = "/*")
public class ExampleFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 在请求处理前执行的逻辑
// ...
chain.doFilter(request, response); // 继续执行其他的Filter或Servlet
// 在请求处理后执行的逻辑
// ...
}
}
拦截器(Interceptor):
@Component
public class ExampleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 在Controller处理前执行的逻辑
// ...
return true; // 继续执行请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 在Controller处理后,返回视图渲染前执行的逻辑
// ...
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 在整个请求结束后执行的逻辑
// ...
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ExampleInterceptor());
}
}
AOP:
@Aspect
@Component
public class ExampleAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
// 在Service层方法执行前执行的逻辑
// ...
}
@After("execution(* com.example.service.*.*(..))")
public void afterMethod(JoinPoint joinPoint) {
// 在Service层方法执行后执行