本篇内容介绍了“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、配置文件
使用<filter>标签在web.xml文件中配置
拦截器的实现:
定义一个类,通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类来定义,该接口实现三个方法,
preHandle()方法:该方法会在控制器方法前执行,其返回值表示是否中断后续操作。当其返回值为true时,表示继续向下执行,当其返回值为false时,会中断后续的所有操作
postHandle()方法:该方法会在控制器方法调用之后,且解析视图之前执行,可以通过此方法对请求域中的模型和视图做出进一步的修改
afterHandle()方法:该方法会在整个请求完成,即视图渲染结束之后执行,可以通过此方法实现一些资源清理,记录日志信息等工作。
拦截器的两种配置方法:
1、在SpringMVC配置文件中,使用<mvc:interceptors> 标签配置
2、定义一个配置类,继承WebMvcConfigurerAdapter,重写addInterceptors方法,对自定义的拦截器进行注册。
“Spring框架的拦截器和过滤器分别有什么作用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。