springboot自定义过滤器的方法
过滤器是servlet的规范,是基于函数回调的,需要实现javax.servlet.filter接口,依赖于tomcat等容器,一般用于过滤请求的url。
1自定义过滤器
自定义filter的实现,本质上只有一种方式,就是实现filter接口。但是在spring中我们有时候也会通过继承框架提供的xxxfilter,例如onceperrequestfilter、 abstractauthenticationprocessingfilter(spring security使用的认证过滤器),当然,这些过滤器所实现的顶层接口还是filter,只不过框架提供的过滤器都是有其特殊职能的,我们自己实现过滤器基本通过下面两种方法。
1.1实现filter接口
public class myfilterone implements filter { @override public void destroy() { //服务停止时销毁; } @override public void dofilter(servletrequest srequest, servletresponse sresponse, filterchain filterchain) throws ioexception, servletexception { system.out.println("this is myfilter,url :" + request.getrequesturi()); //1、进入过滤器,通常在这里根据requet做一些事情 httpservletrequest request = (httpservletrequest) srequest; //2、放行,进入下一个过滤器,如果是最后一个过滤器,就执行controller代码 filterchain.dofilter(srequest, sresponse); //3、回到过滤器,通常在这里对response做一些处理 httpservletresponse response = (httpservletresponse) srequest; } @override public void init(filterconfig arg0) throws servletexception { //服务启动时创建; } }
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(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, filterchain filterchain) throws servletexception, ioexception { system.out.println(httpservletrequest.getrequesturi()); system.out.println("需要过滤的路径"+ arrays.tostring(uripatterns.toarray())); system.out.println("进入过滤器了"); filterchain.dofilter(httpservletrequest, httpservletresponse);//放行 system.out.println("又回到过滤器了"); } private boolean ismatcheduri(string uri) { if (stringutils.isempty(uri)) { return false; } else { iterator var2 = this.uripatterns.iterator(); pattern pattern; do { if (!var2.hasnext()) { return false; } pattern = (pattern)var2.next(); } while(!pattern.matcher(uri).find()); return true; } } }
1.3使过滤器生效配置
使用配置类
@configuration public class myfilterconfiguration { @bean public filterregistrationbean registerfilter() { system.out.println("myfilterconfiguration"); filterregistrationbean registration = new filterregistrationbean(); registration.setfilter(new myfilterone()); registration.addurlpatterns("/public/*");//过滤的路径 registration.addinitparameter("paramname", "paramvalue"); registration.setname("myfilter"); registration.setorder(1);//在过滤链中的执行顺序 return registration; } }
@webfilter和@servletcomponentscan(basepackages = "")
个人比较喜欢这个方式,代码量最小
第一步:在启动类上添加注解@servletcomponentscan(basepackages = "")
第二步:filter类添加@webfilter注解,配置filterregistrationbean的属性@webfilter基本都有
@webfilter(urlpatterns = "/selfannotation/*") @order(-2) public class myfilterfive extends onceperrequestfilter { @override protected void dofilterinternal(httpservletrequest httpservletrequest, httpservletresponse httpservletresponse, filterchain filterchain) throws servletexception, ioexception { system.out.println("进入5号过滤器了"); } }
2 filter生命周期
init():在构造器被调用后,紧接着被调用。作用:用来初始化filter。
dofilter():每一次拦截请求时都会调用。
destroy():方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。