当前位置:首页 > 问答百科 > 正文内容

url过滤怎么解除(Spring)

福瑞号2022-12-06 14:11:14问答百科98
url过滤怎么解除(Spring)-图1
url过滤怎么解除(Spring)-图2
一、拦截器与过滤器
在讲Spring boot之前,我们先了解一下过滤器和拦截器。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。
但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等功能,面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。而我们今天讲的过滤器和拦截器都属于面向切面编程的具体实现。
而两者的主要区别包括以下几个方面:
Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
二、过滤器的配置
现在我们通过过滤器来实现记录请求执行时间的功能,其实现如下:
public class LogCostFilter implements Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException {
} public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis(); filterChain.doFilter(servletRequest,servletResponse); System.out.println("Execute cost="+(System.currentTimeMillis()-start)); public void destroy() {}
这段代码的逻辑比较简单,就是在方法执行前先记录时间戳,然后通过过滤器链完成请求的执行,在返回结果之间计算执行的时间。这里需要主要,这个类必须继承Filter类,这个是Servlet的规范,这个跟以前的Web项目没区别。
但是,有了过滤器类以后,以前的web项目可以在web.xml中进行配置,但是spring boot项目并没有web.xml这个文件,那怎么配置?在Spring boot中,我们需要FilterRegistrationBean来完成配置。其实现过程如下:
@Configuration
public class FilterConfig { @Beanpublic FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new LogCostFilter()); registration.addUrlPatterns("/*");registration.setName("LogCostFilter"); registration.setOrder(1);return registration;
这样配置就完成了,需要配置的选项主要包括实例化Filter类,然后指定url的匹配模式,设置过滤器名称和执行顺序,这个过程和在web.xml中配置其实没什么区别,只是形式不同而已。现在我们可以启动服务器访问任意URL:
url过滤怎么解除(Spring)-图3
大家可以看到上面的配置已经生效了。除了通过 FilterRegistrationBean 来配置以外,还有一种更直接的办法,直接通过注解就可以完成了:
@WebFilter(urlPatterns = "/*", filterName = "logFilter2")
public class LogCostFilter2 implements Filter { System.out.println("LogFilter2 Execute cost=" + (System.currentTimeMillis() - start));
这里直接用@WebFilter就可以进行配置,同样,可以设置url匹配模式,过滤器名称等。这里需要注意一点的是@WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在配置类中加另外一个注解:@ServletComponetScan,指定扫描的包。
@SpringBootApplication
@MapperScan("com.pandy.blog.dao")@ServletComponentScan("com.pandy.blog.filters")public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args);
现在,我们再来访问一下任意URL:
url过滤怎么解除(Spring)-图4
可以看到,我们配置的两个过滤器都生效了。细心的读者会发现,第二个Filter我们并没有指定执行的顺序,但是却在第一个Filter之前执行。这里需要解释一下,@WebFilter这个注解并没有指定执行顺序的属性,其执行顺序依赖于Filter的名称,是根据Filter类名(注意不是配置的filter的名字)的字母顺序倒序排列,并且@WebFilter指定的过滤器优先级都高于FilterRegistrationBean配置的过滤器。有兴趣的朋友可以自己实验一下。
三、拦截器的配置
上面我们已经介绍了过滤器的配置方法,接下来我们再来看看如何配置一个拦截器。我们使用拦截器来实现上面同样的功能,记录请求的执行时间。首先我们实现拦截器类:
public class LogCostInterceptor implements HandlerInterceptor {
long start = System.currentTimeMillis();
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
start = System.currentTimeMillis();
return true;
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作。除了实现上面的接口外,我们还需对其进行配置:
public class InterceptorConfig extends WebMvcConfigurerAdapter { public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry);
这里我们继承了WebMVCConfigurerAdapter,看过前面的文章的朋友应该已经见过这个类了,在进行静态资源目录配置的时候我们用到过这个类。这里我们重写了addInterceptors这个方法,进行拦截器的配置,主要配置项就两个,一个是指定拦截器,第二个是指定拦截的URL。现在我们再启动系统访问任意一个URL:
url过滤怎么解除(Spring)-图7
可以看到,我们通过拦截器实现了同样的功能。不过这里还要说明一点的是,其实这个实现是有问题的,因为preHandle和postHandle是两个方法,所以我们这里不得不设置一个共享变量start来存储开始值,但是这样就会存在线程安全问题。当然,我们可以通过其他方法来解决,比如通过ThreadLocal就可以很好的解决这个问题,有兴趣的同学可以自己实现。不过通过这一点我们其实可以看到,虽然拦截器在很多场景下优于过滤器,但是在这种场景下,过滤器比拦截器实现起来更简单。
四、总结
本文主要对基于Spring boot对过滤器和拦截器的配置进行的讲解。无论是过滤器还是拦截器都属于AOP(面向切面编程)思想的具体实现。除了这两种实现我们还见过另一种更灵活的AOP实现技术,即Aspect,我们可以通过Aspect来完成更多更强大的功能。这个后续再给大家分享。

扫描二维码推送至手机访问。

版权声明:本文由福瑞号发布,如需转载请注明出处。

本文链接:https://www.furui.com.cn/11754.html

“url过滤怎么解除(Spring)” 的相关文章

c位是什么意思网络用语(戏说C位到底是什么样的位置)

c位是什么意思网络用语(戏说C位到底是什么样的位置)

C位到底是什么样的位置? 在互联网的世界中,网友们善于创造各种各样的网络用语,这不一不小心就创造了一个“C位”的词。它代表着重要之人,或者中心之位的意思..... 我们一起来看看,我所理解的C位之意思,看看有啥不同之处。 一、在游戏领域中,C位中的C常常被人翻译成Core、Carry,即核心位置的意...

小葱拌豆腐的歇后语(一清二白的小葱拌豆腐)

小葱拌豆腐的歇后语(一清二白的小葱拌豆腐)

小葱拌豆腐大概是中餐凉菜中最简单的一道了。 做法也真的就是小葱,拌,豆腐而已。 但就是这样一道简单得一穷二白的小菜,却有好多故事可以讲。 第一:那句有名的歇后语 小葱拌豆腐——一清二白,这大概是很多人学会的第一个歇后语。用葱花的青色, 豆腐的白色,来形容什么人或事情,清清楚楚明明白白的,“清”通“...

宋代定窑位于哪个省(汪有良著名鉴定专家论)

宋代定窑位于哪个省(汪有良著名鉴定专家论)

汪有良 中国管理科学研究院学术委员会 特约研究员 从出土古代生活土中残片论述陶瓷历史 今天我要论述的是从衢州一工地出现古代残土中的瓷片说起,为什么要从一片残缺的北宋瓷片论述呢?因为该瓷片可以把中国陶瓷文化的艺术工艺推行到一个最高境界。该瓷片能有什么可以把陶瓷历史推向一个最高度,这里我就从该瓷片...

1号店邮费怎么算(天猫代运营解答淘宝天猫平台海外买家拍下产品邮费怎么计算)

1号店邮费怎么算(天猫代运营解答淘宝天猫平台海外买家拍下产品邮费怎么计算)

天猫代运营解答淘宝天猫平台海外买家拍下产品邮费怎么计算 大家好这里是品融天猫代运营公司,最近有很多的新手商家问到我们一个问题,如果海外的买家拍下了我的产品,我要付的邮费是不是会很高,今天我们就针对这个问题,结合官方的规则,来聊一下这个话题: 天猫代运营解答淘宝天猫平台海外买家拍下产品邮费怎么计算...

一坪等于多少平方米(60坪是多少平方米)

一坪等于多少平方米(60坪是多少平方米)

60坪大约是198.342平方米。 因为1坪约等于3.3平方米,所以60坪直接乘以3.3就等于198.342平方米;坪最早是日本来计算面积的单位,19世纪末日本占领台湾后,台湾就开始用坪来做住宅的面积单位,并且延用至今。 平方米是面积的公制单位,定义为边长为1米的正方形的面积,表示符号为㎡。在生活...

升字开头的成语(四字开头的吉祥语有哪些)

升字开头的成语(四字开头的吉祥语有哪些)

一、四字开头的吉祥语有:四季发财、四方来财、四海升平、四喜临门和四季平安等。 四季发财:祝福人们一年四季都发财。 四方来财:祝福一个人财运亨通,财富主动向他靠拢。 四海升平:意指天下太平,出自《抱妆盒》第三折:“寡人御极以来,幸喜四海升平,八方宁靖。”。 四喜临门:古人所说的人生四大喜事:金榜题名...