本文介绍了如何在springboot中实现过滤器和拦截器(代码)。 可以作为参考,需要的人请参考。 希望能帮上忙。
过滤器和拦截器都是AOP编程思想的引出,可以实现权限检查、日志记录等。 两者有一定的相似之处,不同之处在于,Filter是servlet规范,只能在Web程序中使用,拦截器是Spring规范,可以在Web程序中使用,也可以在APP中使用。
过滤器由servlet定义,并依赖于servlet容器。 拦截器由Spring定义,依赖于Spring容器。
拦截器是Spring组件,由Spring管理并放置在Spring配置文件中,因此可以使用任何Spring资源。 例如,Service和数据源等可以通过IOC容器注入拦截器,但Filter不会。
过滤器只能在servlet之前和之后工作,但拦截器会深入到方法之前和之后,并且会例外地向前和向后抛出。 使用深度更大。
用Spring实现过滤器
如何使用springboot提供的过滤器注册自定义过滤器
publicclassmyfilterimplementsfilter {
@Override
公共void init (过滤器配置文件配置) throws ServletException {
system.out.println (myfilter init . );
}
@Override
publicvoiddofilter (servletrequestservletrequest,ServletResponse servletResponse,过滤器通道过滤器通道) throws IOException
//站点图标/favicon.ico过滤器将运行两次
http servlet请求=(http servlet请求) servlet请求;
系统. out.println (request.getrequest uri () );
system.out.println (myfilterdofilter…);
filter chain.do filter (servlet请求,servlet响应;
}
@Override
公共语音目录
}
}
在springboot中注册过滤器
@Configuration
公共类过滤器配置{
@Bean
publicfilterregistrationbeanregistrationbean (
filterregistrationbeanmyfilter=newfilterregistrationbean (new myfilter ();
myfilter.addURLpatterns('/* ';
返回过滤器;
}
demo运行到此为止时,您会看到do filter运行了两次。 调试程序发现这是因为在浏览器请求时管理了站点图标,可以在uri中找到。 可以根据自己的需要用正则表达式进行适当的控制。
方法2:servlet注释定义文件
@Component
@ web过滤器(filtername=' myfilter2',urlPatterns='/* ' )
公共类myfilter 2实施过滤器{
@Override
公共void init (过滤器配置文件配置) throws ServletException {
system.out.println (myfilter2init . );
}
@Override
publicvoiddofilter (servletrequestservletrequest,ServletResponse servletResponse,过滤器通道过滤器通道) throws IOException
system.out.println (myfilter2do filter…);
filter chain.do filter (servlet请求,servlet响应;
}
@Override
公共语音目录
}
}
使用servleta注释声明的过滤器在运行时只需要一次。 这与使用spring构成过滤器不同。
用Spring实现窃听器
拦截器主要使用定制类集成handler拦截器。 程序持续关闭,直到preHandle返回true,如果返回false,则中断请求。
publicclassmyinterceptorimplementshandlerinterceptor {
@Override
publicbooleanprehandle (httpservletrequestrequest,HttpServletResponse response,对象处理程序) throws Exception {
system.out.println(/preHandler );
返回真;
}
@Override
publicvoidposthandle (httpservletrequestrequest,http servlet响应响应,对象处理程序,@ nullablemodelandviewmodelandler
throws Exception {
system.out.println (后处理程序);
}
@Override
publicvoidaftercompletion (httpservletrequestrequest,http servlet响应响应,对象处理程序,@Nullable Exception ex )
system.out.println (after completion );
}
}
在程序中配置拦截器并声明拦截器规则
@Configuration
publicclassinterceptorconfigimplementswebmvcconfigurer {
@Override
publicvoidaddinterceptors (interceptorregistryregistry ) {
registry.add interceptor (newmyinterceptor () ) ).addpathpatterns ) (/* );
}
}
执行结果