转载

spring拦截器和过滤器

过滤器(Filter):它是依赖于servlet容器。在实现上,基于函数的回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后在传入servlet或者controll进行业务逻辑操作。通常用的场景 :在过滤中修改字符编码、在过滤器中修改HttpServletRequest的一些参数(XSSfilter自定义过滤器),如:过滤低俗文字,危险字符等。

拦截器(interceptors):它是依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其他逻辑操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期能可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

区别:

1、使用范围不同:filter是servlet规范规定的,只能用于web程序中,而拦截器既可以用于web程序,也可以用于application,swing程序中。

2、规范不同:filter是在servlet规范中定义的,是servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。

3、使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源,对象,例如:service对象,数据源,事务管理等,通过Ioc注入到拦截器即可,而Filter则不能

4、深度不同:Filter只在Servlet前后起作用。而拦截器能够深入到方法前后,异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring框架的程序中,要优先使用拦截器。

过滤器的实现:

定义一个类实现javax.servlet.Filter接口,该接口提供三个方法

init(FilterConfig config)方法:此方法用于初始化,在容器加载并实例化过滤器的时候自动调用。容器为此方法传递一个FilterConfig对象,其中包含配置信息。

doFilter(servletRequest request,ServletResponse response,FilterChain chain)方法:此方法是过滤器的核心方法,用于对请求和响应进行处理。

destiry()方法:此方法用于销毁过滤器,但容器销毁过滤器实例之前自动调用

过滤器的两种配置方法:

1、注解:

@WebFilter将一个实现了javax.servlet.Filte接口的类定义为过滤器

属性filterName声明过滤器的名称,可选

属性urlPatterns指定要过滤的URL模式,也可使用属性value来声明

2、配置文件

使用标签在web.xml文件中配置

拦截器的实现:

定义一个类,通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类来定义,该接口实现三个方法,

preHandle()方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行,当其返回值为false时,会中断后续的所有操作

postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行,可以通过此方法对请求域中的模型和视图做出进一步的修改

afterHandle()方法:该方法会在整个请求完成,即视图渲染结束之后执行,可以通过此方法实现一些资源清理,记录日志信息等工作。

拦截器的两种配置方法:

1、在SpringMVC配置文件中,使用 标签配置

2、定义一个配置类,继承WebMvcConfigurerAdapter,重写addInterceptors方法,对自定义的拦截器进行注册。

转载自:https://my.oschina.net/u/4131739/blog/3123267

正文到此结束
该篇文章的评论功能已被站长关闭
本文目录