filter、interceptor、aspect应如何选择?很多人中招
副标题[/!--empirenews.page--]
前言小伙伴们应该听说过过滤器、拦截器、切面,印象上都能够起到截断拦截的作用,在做一些业务需求时,不知道如何选择,今天老顾就来介绍一下他们之间的区别。 Filter过滤器过滤器可以拦截到方法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出过滤操作。
使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。 话不多说,先上代码 ![]() 再定义两个Controller,一个UserController,一个OrderController ![]() ![]() 虽然Filter过滤器和Controller请求都已经定义了,但现在过滤器是不起作用的。需要把Filter配置一下,有两个方案 第一个方案在Filter上面加上@Component
第二个方案配置化注册过滤器 ![]() 第二个方案的特点就是可以细化到过滤哪些规则的URL 我们来启动应用时,过滤器被初始化了,init函数被回调。 ![]()
![]() 看看控制台的日志输出 ![]()
![]() 控制台日志输出 ![]() 停止应用后,控制台输出 ![]() Filter随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
我们再来看看doFilter方法
从参数我们看到,filter里面是能够获取到请求的参数和响应的数据;但此方法是无法知道是哪一个Controller类中的哪个方法被执行。 还有一点需要注意的是,filter中是没法使用注入的bean的,也就是无法使用@Autowired ![]() 上面代码注入的值为null。这是为什么呢?
Interceptor拦截器依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在一个方法前,调用一个方法,或者在方法后,调用一个方法。 ![]() 在WebMvcConfigurationSupport配置一下 ![]() 执行结果 ![]() 我们发现拦截器中可以获取到Controller对象 preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) object handler就是controller方法对象 HandlerMethod handlerMethod = (HandlerMethod)handler; 但我们发现获取不到方法的参数值,这个是为什么呢?在DispatcherServlet类中,方法 (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |