过滤器是rvlet的规范,是基于函数回调的,需要实现javax.rvlet.filter接口,依赖于tomcat等容器,一般用于过滤请求的url。
自定义filter的实现,本质上只有一种方式,就是实现filter接口。但是在spring中我们有时候也会通过继承框架提供的xxxfilter,例如onceperrequestfilter、 abstractauthenticationprocessingfilter(spring curity使用的认证过滤器),当然,这些过滤器所实现的顶层接口还是filter,只不过框架提供的过滤器都是有其特殊职能的,我们自己实现过滤器基本通过下面两种方法。
1.1实现filter接口
public class myfilterone implements filter { @override public void destroy() { //服务停止时销毁; } @override public void dofilter(rvletrequest srequest, rvletrespon srespon, filterchain filterchain) throws ioexception, rvletexception { system.out.println("this is myfilter,url :" + request.getrequesturi()); //1、进入过滤器,通常西米粽子的制作方法在这里根据requet做一些事情 httprvletrequest request = (httprvletrequest) srequest; //2、放行,进入下一个过滤器,如果是最后一个过滤器,就执行controller代码 filterchain.dofilter(srequest, srespon); //3、回到过滤器,通常在这里对respon做一些处理 httprvletrespon respon = (httprvletrespon) srequest; } @override public void init(filterconfig arg0) throws rvletexception { //服务启动时创建; }}
1.2继承onceperrequestfilter
下面的实现,并没有配置过滤路径,所有的请求都会进入到这个过滤器,但是它通过@value获取配置的url列表,然后用这个列表去和进入过滤器的请求进行对比,如果匹配就做一些操作,如果不匹配直接放行。个人觉得还是配置过滤路径好。
@component@order(-1)public class myfilterthree extends onceperrequestfilter { private final list<pattern> uripatterns = new arraylist<pattern>(); @value("#{'${filtered.uris:^$}'.split(',')}") private list<string> filtereduris; @postconstruct public void initialize() { for (string uri : this.filtereduris) { try { this.uripatterns.add(pattern.compile(uri)); system.out.println(string.format("符合 '%s' 格式的uri,将进行过滤处理,否则放行.", uri)); } catch (patternsyntaxexception patternsyntaxexception) { system.out.println("invalid regular expression pattern in filtered.uris: " + uri); } } } @override protected void dofilterinternal(httprvletrequest httprvletrequest, httprvletrespon httprvletrespon, filterchain filterchain) throws rvletexception, ioexception { system.out.println(httprvletrequest.getrequesturi()); system.out.println("需要过滤的路径"+ arrays.tostring(uripatterns.toarray())); system.out.println("进入过滤器了"); filterchain.dofilter(httprvletrequest, httprvletrespon);//放行 system.out.println("又回到过滤器了"); } private boolean ismatcheduri(string uri) { if (stringutils.impty(uri)) { return fal; } el { iterator var2 = this.uripatterns.iterator(); pattern pattern; do { if (!var2.hasnext()) { return fal; } pattern = (pattern)var2.next(); } while(!pattern.matcher(uri).find()); return true冷色调有哪些; } }}
1.3使过滤器生效配置
使用配置类
@configurationpublic class myfilterconfiguration { @bean public filterregistrationbean registerfilter() { system.out.println("myfilterconfiguration"); filterregist周边自助游rationbean registration = new filterregistrationbean(); registration.tfilter(new myfilterone()); registration.addurlpatterns("/public/*");//过滤的路径 registration.addinitparameter("paramname", "paramvalue"); registration.tname("myfilter"); registration.torder(1);//在过滤链中的执行顺序 return registration; }}
@webfilter和@rvletcomponentscan(bapackages = “”)
个人比较喜欢这个方式,代码量最小
第一步:在启动类上添加注解@rvletcomponentscan(bapackages = “”)
第二步:filter类添加@webfilter注解,配置filterregistrationbean的属性@webfilter基本都有
@webfilter(urlpatterns = "/lfannotation/*")@order(-2)public class myfilterfive extends onceperrequestfilter { @override protected void do时间安排filte喝蜂蜜有什么好处rinternal(httprvletrequest httprvletrequest, httprvletrespon httprvletrespon, filterchain filterchain) throws rvletexception, ioexception { system.out.println("进入5号过滤器了"); }}
init():在构造器被调用后,紧接着被调用。作用:用来初始化filter。
dofilter():每一次拦截请求时都会调用。
destroy():方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 13:06:47,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/6a263f4f0386d6c656a6201c1aaf66b3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:springboot自定义过滤器的方法.doc
本文 PDF 下载地址:springboot自定义过滤器的方法.pdf
留言与评论(共有 0 条评论) |