自定义filter与interceptor
admin
2024-03-18 01:07:30

文章目录

  • 1.Filter
  • 2.Interceptor
  • 3. 对比
  • 4. 程序示例
    • 4.1 Filter
    • 4.2 Interceptor

1.Filter

它依赖于servlet容器。它可以对几乎所有请求进行过滤。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。

通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。

2.Interceptor

它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制。

属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。

由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。拦截器可以对静态资源的请求进行拦截处理。

3. 对比

1、Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。

2、Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。

3、Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。

4、Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。

5、在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。

6、Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

4. 程序示例

kotlin 的springboot项目

4.1 Filter

import org.apache.catalina.connector.RequestFacade
import java.io.IOException
import javax.servlet.*
import javax.servlet.annotation.WebFilter@WebFilter(urlPatterns = ["/test/*"])
class RootCustomerFilter : Filter {@Throws(IOException::class, ServletException::class)override fun doFilter(servletRequest: ServletRequest, servletResponse: ServletResponse, filterChain: FilterChain) {println(servletRequest.localAddr)println((servletRequest as RequestFacade).requestURI)filterChain.doFilter(servletRequest, servletResponse)}@Throws(ServletException::class)override fun init(filterConfig: FilterConfig) {super.init(filterConfig)}override fun destroy() {super.destroy()}
}

这是一个自定义的filter,实现FIlter接口。在doFilter方法中进行处理,改变请求的内容。
除了要在类上添加@WebFilter注解,指定要过滤的路径外,还要在启动类配置注解@ServletComponentScan(basePackages = [“com.example.filterinterceptor.filter”])指定filter的位置,这样就可以使用到此filter。

4.2 Interceptor

import org.springframework.web.servlet.HandlerInterceptor
import org.springframework.web.servlet.ModelAndView
import java.lang.Exception
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponseclass CustomerInterceptor : HandlerInterceptor{override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {println("this is preHandle into ...")return super.preHandle(request, response, handler)}override fun postHandle(request: HttpServletRequest,response: HttpServletResponse,handler: Any,modelAndView: ModelAndView?) {super.postHandle(request, response, handler, modelAndView)}override fun afterCompletion(request: HttpServletRequest,response: HttpServletResponse,handler: Any,ex: Exception?) {super.afterCompletion(request, response, handler, ex)}
}

定义了拦截器之后,还需要配置:

import com.example.filterinterceptor.interceptor.CustomerInterceptor
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport@Configuration
class WebConfig: WebMvcConfigurationSupport() {override fun addInterceptors(registry: InterceptorRegistry) {super.addInterceptors(registry)val pathPatterns = "/test/**"val excludePathPatterns = "/api/**"registry.addInterceptor(CustomerInterceptor()).addPathPatterns(pathPatterns).excludePathPatterns(excludePathPatterns)}
}

这样就可以使用此拦截器,对请求进行处理了。

相关内容

热门资讯

墨镜姐最新推荐qq女生伤感个性... 墨镜姐最新推荐qq女生伤感个性签名 1、简单的是我想你,困难的是我们不在一起。 2、我还...
最新或2023(历届)最新版的... 最新或2023(历届)最新版的个性搞笑签名,不搞笑你来砍我 1、你长得像笑话,活的像废话。 ...
能让你内心变强大的励志个性签名... 能让你内心变强大的励志个性签名说说大全 1、别人永远对,我永远错,这样子比较没烦恼。 2...
青春疼痛伤感个性签名 青春疼痛... 青春疼痛伤感个性签名  1、我想写最美的句子给最干净的年纪。  2、我觉得,我这辈子最灿烂的笑容,大...
令人捧腹大笑的幽默搞笑个性签名... 令人捧腹大笑的幽默搞笑个性签名  1、人生若是无误,铅笔何需橡皮。  2、青春就像卫生纸,用的时候感...