Filter、Interceptor、AOP三种拦截方式比较

Filter

javax.servlet.filter 是java sevlet规范定义的接口,定义了3个方法

public void init(FilterConfig filterConfig) throws ServletException;

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException;

public void destroy();

filter 的缺点在于无法拿到具体请求的哪个controller的哪个方法

Interceptor

通过org.springframework.web.servlet.HandlerInterceptor接口实现

该接口是由SpringMVC提供,有三个方法

default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    return true;
}

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}

default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}

该方式可以拿到请求的具体类名和方法

((HandlerMethod)handler).getBean().getClass().getName()
((HandlerMethod)handler).getMethod().getName()

但是这种方式拿不到方法上的具体参数值

AOP

可以通过ProceedingJoinPoint 拿到具体的参数值
但是无法获取HttpServletRequest 和HttpServletResponse 对象

@Around("execution(* com.jerio.web.controller.UserController.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
    Object[] args = pjp.getArgs();
        for (Object arg : args) {
            System.out.println("arg is "+arg);
        }
// 获取类名
pjp.getSignature().getDeclaringTypeName()
// 获取方法名
pjp.getSignature().getName()
}

如果想要拿到Request对象,需要借助Spring提供的org.springframework.web.context.request.RequestContextHolder,该类使用ThreadLocal保存了本次请求的相关信息

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前3天因为上班所以和儿子的接触非常少,但是我没觉得不舒服,而且觉得我们都在一个点上,彼此相安,彼此内心是平静,感赏...
    徐亚娟阅读 168评论 0 2
  • 了不起的怪物阅读 271评论 1 4
  • 让孩子做孩子,他们长大后就能做成人。这个世界上也就不会有那么多老气横秋的孩子和满是孩子气的成人。
    蓝心老师阅读 141评论 0 0