加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

filter、interceptor、aspect应如何选择?很多人中招

发布时间:2019-08-22 05:56:52 所属栏目:移动互联 来源:老顾聊技术
导读:前言 小伙伴们应该听说过过滤器、拦截器、切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别。 Filter过滤器 过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse r
副标题[/!--empirenews.page--]

 前言

小伙伴们应该听说过过滤器、拦截器、切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别。

Filter过滤器

过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出过滤操作。

过滤器依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,一个过滤器实例只能在容器初始化时调用一次。

使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

话不多说,先上代码

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

再定义两个Controller,一个UserController,一个OrderController

阿里二面:filter、interceptor、aspect应如何选择?很多人中招 阿里二面:filter、interceptor、aspect应如何选择?很多人中招

虽然Filter过滤器和Controller请求都已经定义了,但现在过滤器是不起作用的。需要把Filter配置一下,有两个方案

第一个方案在Filter上面加上@Component

  1. @Component 
  2. public class TimeFilter implements Filter 

第二个方案配置化注册过滤器

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

第二个方案的特点就是可以细化到过滤哪些规则的URL

我们来启动应用时,过滤器被初始化了,init函数被回调。

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

请求http://localhost:9000/order/1

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

看看控制台的日志输出

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

请求http://localhost:9000/user/1

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

控制台日志输出

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

停止应用后,控制台输出

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

Filter随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。

1.启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;

2.每一次请求时都只调用方法doFilter()进行处理;

3.停止服务器时调用destroy()方法,销毁实例。

我们再来看看doFilter方法

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

从参数我们看到,filter里面是能够获取到请求的参数和响应的数据;但此方法是无法知道是哪一个Controller类中的哪个方法被执行。

还有一点需要注意的是,filter中是没法使用注入的bean的,也就是无法使用@Autowired

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

上面代码注入的值为null。这是为什么呢?

其实Spring中,web应用启动的顺序是:listener->filter->servlet,先初始化listener,然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。

如果一定你要使用,需要做一些处理,可以私信老顾哦

Interceptor拦截器

依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在一个方法前,调用一个方法,或者在方法后,调用一个方法。

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

在WebMvcConfigurationSupport配置一下

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

执行结果

阿里二面:filter、interceptor、aspect应如何选择?很多人中招

我们发现拦截器中可以获取到Controller对象

preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

object handler就是controller方法对象

HandlerMethod handlerMethod = (HandlerMethod)handler;
handlerMethod.getBean().getClass().getName(); //获取类名
handlerMethod.getMethod().getName(); //获取方法名

但我们发现获取不到方法的参数值,这个是为什么呢?在DispatcherServlet类中,方法

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读