SpringBoot中使用Filter和Interceptor的示例代码
一、filter(过滤器)
filter接口定义在javax.servlet包中,是servlet规范定义的,作用于request/response前后,被servlet容器调用,当filter被sring管理后可以使用spring容器资源。
实现一个filter
自定义的过滤器需要实现javax.servlet.filter,filter接口中有三个方法:
- init(filterconfig filterconfig):过滤器初始化的被调用。
- dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain chain):在dofilter()方法中,chain.dofilter()前的一般是对request执行的过滤操作,chain.dofilter后面的代码一般是对response执行的操作,chain.dofiter()执行下一个过滤器或者业务处理器。
- destory():过滤器销毁的时候被调用。
在spring容器中使用过滤器
通过filterregistrationbean
@configuration public class webconfig{ @bean public filterregistrationbean xxxfilter() { filterregistrationbean registrationbean = new filterregistrationbean(); registrationbean.setfilter(new xxxfilter()); registrationbean.seturlpatterns(arrays.aslist("/*")); registrationbean.setorder(1); // 过滤器的优先级 return registrationbean; } }
通过@webfilter和@servletcomponentscan
通过@webfilter的方式定义filter,默认使用filter的类名设置优先级。使用filterregistrationbean可以指定优先级。filter使用白名单过滤url的方式,配置需要拦截的url,如果想设置不过滤某些url需要在dofilter方法中指定。
二、interceptor(拦截器)
定义一个interceptor需要实现org.springframework.web.servlet.handlerinterceptor接口,interceptor是spring容器定义的,它可以使用spring容器的任何资源,只要通过ioc注入到interceptor即可,interceptor可以深入到业务处理方法的执行前后和抛出异常的时候,而filerter无法做到这一点,所以interceptor相比filter具有更大的弹性。
实现一个interceptor
实现handlerinterceptor或者继承handlerinterceptoradapter
public interface handlerinterceptor { 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 { } }
- prehandle:在业务处理器处理请求之前被调用。
- posthandle:在业务处理器处理请求后并生成视图前被调用,此时有机会修改modelandview。
- aftercompletion:业务处理处理器处理完请求后(已经渲染视图)被执行,并可以处理业务方法发生异常的场景。
在spring容器中使用拦截器
@configuration public class webconfig implements webmvcconfigurer { @override public void addinterceptors(interceptorregistry registry) { interceptorregistration registration = registry.addinterceptor(new timeinterceptor()); registration.excludepathpatterns("/user"); registration.excludepathpatterns("/*"); } }
interceptor既可以指定要过滤的url也可以指定不拦截的url,缺省情况拦截所有url。
三、调用顺序
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
SpringBoot中使用Filter和Interceptor的示例代码
-
SpringBoot使用H2内存数据库单元测试的代码示例
-
使用python求斐波那契数列中第n个数的值示例代码
-
10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用_html/css_WEB-ITnose
-
C#使用OpenCV剪切图像中的圆形和矩形的示例代码
-
Jquery使用mouseenter和mouseleave事件实现鼠标经过弹出层且可以点击的示例代码分享
-
SpringBoot中默认缓存实现方案的示例代码
-
浅析C#中的“==”和Equals的示例代码
-
PHP中抽象类和接口的使用方法(代码)
-
oracle中的greatest 函数和 least函数示例代码