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(五)过滤器和拦截器
-
Java拦截器和过滤器的区别分析
-
SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景
-
springboot的拦截器和过滤器实现
-
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
-
spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序
-
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
-
SpringCloud之路由网关zuul和过滤器(五)
-
Java:SpringBoot集成filter过滤器、interceptor拦截器
-
springboot跨域过滤器与swagger拦截器冲突的解决方案