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

springboot(五)过滤器和拦截器

程序员文章站 2023-01-11 18:49:35
前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查、日志记录等。二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Spring规范,可以用在Web程序中,也可以用在Application程序中。 Filter是servlet ......

前言

       过滤器和拦截器二者都是aop编程思想的提现,都能实现诸如权限检查、日志记录等。二者有一定的相似之处,不同的地方在于:

  • filter是servlet规范,只能用在web程序中,而拦截器是spring规范,可以用在web程序中,也可以用在application程序中。
  • filter是servlet中定义的,依赖servlet容器。而拦截器在spring中定义,依赖spring容器。
  • 拦截器是一个spring组件,归spring管理,配置在spring的配置文件中,因此它可使用spring的任何资源。比如service、数据源等,通过ioc容器注入到拦截器即可,而filter则不行。
  • filter只在servlet前后起作用,而拦截器则能深入到方法前后,异常抛出前后。使用深度更大一些。

 

spring中实现过滤器filter

方法1:使用springboot提供的 filterregistrationbean注册自定义过滤器

public class myfilter implements filter {

    @override
    public void init(filterconfig filterconfig) throws servletexception {
        system.out.println("myfilter init...");
    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
        //站点图标/favicon.ico  filter会执行2次
        httpservletrequest request=(httpservletrequest) servletrequest;
        system.out.println(request.getrequesturi());
        system.out.println("myfilter dofilter...");
        filterchain.dofilter(servletrequest,servletresponse);
    }

    @override
    public void destroy() {

    }
}

 在springboot中注册filter

@configuration
public class filterconfig {

    @bean
    public filterregistrationbean registrationbean(){
        filterregistrationbean myfilter=new filterregistrationbean(new myfilter());
        myfilter.addurlpatterns("/*");

        return myfilter;
    }

   到这里运行demo时会发现do filter执行了2次,debug发现这是因为浏览器请求时站点图标管理,通过uri能发现。可以根据自己的需求用正则表达式适当控制。

 

方法2:servlet注解定义filter

@component
@webfilter(filtername = "myfilter2",urlpatterns = "/*")
public class myfilter2 implements filter {
    @override
    public void init(filterconfig filterconfig) throws servletexception {
        system.out.println("myfilter2 init...");
    }

    @override
    public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
        system.out.println("myfilter2 dofilter ...");
        filterchain.dofilter(servletrequest,servletresponse);
    }

    @override
    public void destroy() {

    }
}

 运行结果

 

 使用servleta注解声明的filter,执行时只有一次请求。和使用spring配置filter这里不同。

 

spring中实现拦截器

    拦截器主要使用自定义类集成handlerinterceptor。prehandle返回true时程序才会继续向下执行,返回false则中断请求。

public class myinterceptor implements handlerinterceptor {

    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
        system.out.println("/prehandler");
        return true;
    }

    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler, @nullable modelandview modelandview) 
throws exception { system.out.println("posthandler"); } @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, @nullable exception ex) throws exception { system.out.println("aftercompletion"); } }

 在程序中配置拦截器并声明拦截规则

@configuration
public class interceptorconfig implements webmvcconfigurer {

    @override
    public void addinterceptors(interceptorregistry registry) {
        registry.addinterceptor(new myinterceptor()).addpathpatterns("/*");
    }
}

 运行结果

springboot(五)过滤器和拦截器