springboot分别使用过滤器,拦截器,切片

1,springboot使用过滤器;

第一步:自定义一个类实现Filter类,然后在类上面使用@Component自定义为一个bean即可,这种方式最简便,但是有时候我们使用第三方过滤器,人家的代码不能改动,我们又不能在它上面使用注解,那么springboot怎么使用它呢?如下:

定义一个spring配置类。

过滤器不知道调用的目的,即哪个controller,哪个方法,我们只知道request,response。而拦截器就知道。

2,springboot使用拦截器:

第一步:自定义一个类实现HandlerInterceptor类并重写方法,

@Component

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

第一个方法在调用controller之前调用返回true就会往下执行,第二个方法在处理玩controller后调用,但是如果执行过程中有异常就不会调用,第三个方法无论有没异常都会调用。那么为什么说拦截器可以得到调用的controller与及方法的信息呢?如下:

通过第三个参数handler,这个类可以转型为HandlerMethod,及当前对象。但是还有个局限性,它不知道方法的参数值是什么。

刚刚说有没有异常第三个方法都会执行,那么没有异常时第三个方法的Exception参数是空的。

上面的讲解基本完成,这里讲一下注意点,这里光靠上面的@Component注解,这个拦截器不能起作用。还是需要配置的。如下:

需要自定义个配置类继承WebMvcConfigurerAdapter,把自定义的拦截器类注入进来,然后重写addTnterceptor方法。

这里有个地方要注意,如果你定义了全局异常处理器类,如@ControllerAdvice,这时候这里就不能接收到异常,因为异常已经被异常处理器接收,如果没有在异常处理器声明处理这个异常,那么在拦截器上就会被接收。

3,springboot使用切片

切片就是一个类,

有如下注解:@before,@after,@afterthrow,@Around,@Around这个把前面三个都包含在里面。 一般都是用around.

我们先看一个表达式:execution(* com.kk.ww.UserController.*(..)),这个第一个星号代表任何返回值,第二个是这个controller任何的方法,括号里面的..代表任何的参数。

上面的handle方法有一个参数,这个参数对象包含当前拦截方法的信息。

但是在aop中拿不到它的原始的http请求与相应的对象。

总结:这三个拦截机制各有各的优势。

他们的顺序(没出异常):filter->interceptor->controlleradvice->aspect->controller

如果出异常,就是上面的倒过来。controller出现异常,首先由aspect切片处理,如果他没有处理,那么交给controlleradvice处理,如果还没没处理,就交给interceptor。

猜你喜欢

转载自blog.csdn.net/lwg_1540652358/article/details/84285855