springboot怎么配置过滤器,springboot整合filter
00-1010 1.公共接口访问2。添加滤镜1,自定义滤镜2,注册到容器3,演示效果:3。添加两个过滤器。首先,建立一个MVC的基本请求接口,如下:
目录
如上所述,首先添加一个testController。
先用邮递员测试一下。它不起作用。
结果是成功的,准备工作完成了。
00-1010在下面添加一个过滤器,实现一个接口拦截和令牌验证的模拟。
简单处理,有以下两个步骤。
一、普通的接口访问
包com . example . demo _ filter _ interceptor . config;导入javax . servlet . *;导入javax . servlet . http . http servlet request;导入Java . io . io exception;/* * * @ class namestfilter * @ description todo * @ date 2022/4/119336030 * @ createdbyzrc *//实现基于回调的过滤接口,类似于ajax请求成功。公共测试过滤器实现filter {//init方法初始化过滤器,类似构造方法的初始化函数可以在init()方法中完成。//如果要在初始化代码中使用FillerConfig对象,那么这些初始化代码只能写在Filler的init()方法中,而@ override public void init(filter config filter config)抛出servlet异常{ filter . super . init(filter config))不能写在构造函数中;System.out.println(的第一个筛选器已成功初始化。.);doFilter()方法有多个参数,其中//参数request和response是Web服务器或过滤器链中上一级过滤器传递的请求和响应对象;//参数链表示当前滤镜链的对象,//你只需要在当前滤镜对象的doFilter()方法内部调用Filter chain对象的doFilter()。方法可以将请求传递给过滤器链中的下一个过滤器或者目标程序handles @ override public void do Filter(servlet request servlet request,servlet response servlet response,FilterChain filterChain)抛出IOException,servlet exception { http servlet request request=(http servlet request)servlet request;//这里为了使用getHeader方法获取令牌,将其转化为HTTP servlet request system . out . println( token 3360 req . get header( token ));string token=req . get header( token );//然后判断标记是否正确if(null==token){抛出新的运行时异常( token为空);}//调用doFilter方法,正常返回servlet响应filterchain.dofilter (servlet请求,servlet响应);} //destroy()方法在Web服务器卸载Filter对象之前调用。该方法用于释放Filter对象打开的资源,如关闭数据库和I/O流@ override public void destroy(){ Filter . super . destroy();system . out . println( filter destroyed );}}实现servlet的Filter接口,以及重写他的三个方法,即init、doFilter、destroy。
>init:过滤器初始化时回调,可以在这里做过滤器的初始化操作,例如设置白名单路径列表。doFilter:过滤器初始化后并在请求到达后端且进入到注册过滤器设置的匹配路径时回调。destroy:过滤器销毁时回调。上图是一个简单实现token校验是否为空,没有进行正确与否的校验,可以引入redis(前面章节有讲到)或者其他的存储,然后进行一个正确性的校验。从request中获取token头,若存在则调用doFilter方法(通过过滤器),否则不作操作(就是不通过过滤器,不会抵达controller)。
2、注册到容器
@Configurationpublic class TestFilterConfig { @Bean public FilterRegistrationBean filterRegistrationBean(){ //创建一个注册过滤器对象 FilterRegistrationBean registrationBean = new FilterRegistrationBean(); //设置自定义过滤器 registrationBean.setFilter(new TestFilter()); //设置过滤拦截匹配规则,/*是匹配所有// registrationBean.addUrlPatterns("/*"); //只拦截testController下面的接口 registrationBean.addUrlPatterns("/testController/*"); //存在多个过滤器时,设置执行顺序,值越大,执行顺序越靠后 registrationBean.setOrder(2); //返回这个注册过滤器对象 return registrationBean; } }
将自定义过滤器注册到容器中,通过FilterRegistrationBean的一系列方法设置过滤器的参数,例如需要过滤的路径,过滤器的优先级等等。
3、演示一下效果:
不带token:
带token:
三、增加两个过滤器
下面再整一下当存在多个过滤器时,怎么设置哪一个过滤器先拦截,哪一个后执行(优先级)。
跟第二节一样,再整一个自定义过滤器。
package com.example.demo_filter_interceptor.config; import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException; /** * @Classname TestFilter * @Description TODO * @Date 2022/4/11 19:30 * @Created by zrc *///实现Filter接口,基于回调的方式,类似ajax请求的success。public class TestFilter2 implements Filter { //init方法,初始化过滤器,可以在init()方法中完成与构造方法类似的初始化功能, //如果初始化代码中要使用到FillerConfig对象,那么这些初始化代码就只能在Filler的init()方法中编写而不能在构造方法中编写 @Override public void init(FilterConfig filterConfig) throws ServletException { Filter.super.init(filterConfig); System.out.println("第二个过滤器成功初始化。。。。。。。。。。。。。"); } //doFilter()方法有多个参数,其中 //参数request和response为Web服务器或Filter链中的上一个Filter传递过来的请求和响应对象; //参数chain代表当前Filter链的对象, //只有在当前Filter对象中的doFilter()方法内部需要调用FilterChain对象的doFilter()法才能把请求交付给Filter链中的下一个Filter或者目标程序处理 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("这里是第一顺序的拦截器"); filterChain.doFilter(servletRequest, servletResponse); } //destroy()方法在Web服务器卸载Filter对象之前被调用,该方法用于释放被Filter对象打开的资源,例如关闭数据库和I/O流 @Override public void destroy() { Filter.super.destroy(); System.out.println("过滤器被销毁"); }}
修改注册过滤器的类。
类似第一个过滤器的注册,再注册一个第二个过滤器即可,可以设置不同的拦截路径,各负责各的逻辑处理,此处只演示一下执行顺序问题,第一个设置Order参数为2,第二个设置为1,越大的越后执行。设置后,用postman测试一下。
调用接口后发现,先进入了第一个过滤器的doFilter方法,再进入的第二个过滤器的doFilter方法,验证order参数是有效的。
到此这篇关于springboot整合过滤器实战的文章就介绍到这了,更多相关springboot整合过滤器内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。