欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot自定义过滤器的方法

程序员文章站 2022-03-04 13:41:51
过滤器是servlet的规范,是基于函数回调的,需要实现javax.servlet.filter接口,依赖于tomcat等容器,一般用于过滤请求的url。1自定义过滤器自定义filter的实现,本质上...

过滤器是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():方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。