@Component
@WebFilter(urlPatterns = {"/*"})
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 在请求进入容器后 servlet前
System.out.println("CustomFilter doFilter 前");
// 放行请求
chain.doFilter(request, response);
// 请求离开servlet后
System.out.println("CustomFilter doFilter 后");
}
}
自定义拦截器
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行拦截处理 返回 true 表示继续处理请求,返回 false 则表示拦截请求
System.out.println("CustomInterceptor preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理之后调用,但在视图被渲染之前(Controller方法调用之后)
System.out.println("CustomInterceptor postHandle 请求处理之后调用,但在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 整个请求处理完毕后调用,即视图渲染完毕或者发生异常时调用
System.out.println("CustomInterceptor afterCompletion 整个请求处理完毕后调用,即视图渲染完毕或者发生异常时调用");
}
}
基于springmvc编写配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/**"); // 设置拦截的路径
}
}
引入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
编写配置类
@Aspect
@Component
public class HelloAop {
@Pointcut("execution(* com.lxw.afi.controller.HelloController.hello(..))")
public void pointcut() {
}
@Before("pointcut()")
public void before(JoinPoint joinPoint) {
System.out.println("@Before");
}
@AfterThrowing("pointcut()")
public void afterThrowing() {
System.out.println("@AfterThrowing");
}
@AfterReturning("pointcut()")
public void afterReturning() {
System.out.println("@AfterReturning");
}
@After("pointcut()")
public void after() {
System.out.println("@After");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object result;
try {
System.out.println("@Around...方法执行前");
result = pjp.proceed();
System.out.println("@Around...方法执行后");
} catch (Throwable throwable) {
System.out.println("@Around...抛出异常后");
throw throwable;
} finally {
System.out.println("@Around...finally");
}
return result;
}
在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是aop。 比如: 权限校验,一般情况下,所有的请求都需要做登陆校验,此时就应该使用过滤器在最顶层做校验;日志记录,一般日志只会针对部分逻辑做日志记录,而且牵扯到业务逻辑完成前后的日志记录,因此使用过滤器不能细致地划分模块,此时应该考虑拦截器,然而拦截器也是依据URL做规则匹配,因此相对来说不够细致,因此我们会考虑到使用AOP实现,AOP可以针对代码的方法级别做拦截,很适合日志功能。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有