背景
做过JavaWeb开发的对过滤器和拦截器肯定不会陌生,而且也会熟练的使用,但是关于过滤器和拦截器具体的区别和差异可能不是特别的了解,这篇文章就跟大家介绍下过滤器和拦截器的区别。
过滤器 Filter
首先介绍下什么是过滤器,过滤器英文叫过滤器,是JavaEE的标准,依赖于小型应用程序容器,使用的时候是配置在web.xml文件中的,可以配置多个,执行的顺序是根据配置顺序从上到下。常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证码。!-过滤器-
过滤器
过滤器名称/过滤器名称
筛选器类组织。弹簧框架。网络。过滤器。fndy/滤波器级
初始化参数
参数名编码/参数名
参数值Utf-8/参数值
/init-param
初始化参数
参数名强制编码/参数名
参数值真/参数值
/init-param
/filter
过滤映射
过滤器名称/过滤器名称
全球资源定位器(Uniform Resource Locator)模式/*/url模式
/filter-映射
!-过滤器端-
参考实现
导入javax。servlet。*;
导入javax。servlet。http。HttpServletrequest
导入javax。servlet。http。HttpServletResponse
导入Java。io。ioexception
导入Java。乌提尔。日期;
公共类验证码过滤器实现了筛选器{
公共void init(FilterConfig配置)引发了ServletException {
}
public void destroy(){ 0
}
public void doFilter(servlet请求servlet请求,
ServletResponse servletResponse,FilterChain filterChain)
引发IOException,ServletException {
httpersvletrequest请求=(httpersvletrequest)servlet请求;
httpersvletresponse=(httpersvletresponse)servlet响应;
字符串servlet路径=请求。getservlet路径();
//获取验证码
if(servlet路径。匹配('/验证码。jpg '){ 0
回应。setcontenttype(' image/JPEG ');
//禁止图像缓存。
response.setHeader('Pragma ','无缓存');
response.setHeader('缓存控制','无缓存');
回应。setdateheader(' Expires ',0);
//参数:宽、高、字符数、干扰量
CaptchaProductor vCode=新的captchproductor(70,30,4,75);
//根据代币保存验证码内容
captchlean bean=new captchlean();
比恩。SetCaptcha(VCode。GetCode());
bean.setCreateTime(新的date());
httpessionutils。setsessionvalue(请求,' sessionCaptcha ',bean);
vcode。写(回应。getoutputstream());
返回;
}
}
}
过滤器的实现可以通过实现过滤器接口或者继承春天的组织。弹簧框架。网络。过滤器。onceperrequestfilter来实现。
拦截器 Interceptor
拦截器拦截机不依赖小型应用程序容器,依赖春天等网框架,在SpringMVC框架中是配置在SpringMVC的配置文件中,在回弹项目中也可以采用注解的形式实现。拦截器是面向切面编程的一种应用,底层采用Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)的反射机制来实现的。与过滤器一个很大的区别是在拦截器中可以注入春天的比恩,能够获取到各种需要的服务来处理业务逻辑,而过滤器则不行。!-拦截器-
MVC :拦截器
!-多个拦截器,顺序执行-
豆类=' com。测试。管理员。拦截者。auth interceptor “/
/MVC :拦截器
参考实现
公共类AuthInterceptor扩展了HandlerInterceptorAdapter {
@覆盖
公共无效的后句柄(HttpServletrequest请求、HttpServletResponse响应、对象处理程序、模型和视图模型和视图)引发异常(
//todo
super.postHandle(请求、响应、处理程序、模型和视图);
}
@覆盖
公共布尔预处理程序(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)引发异常{
//todo
返回super.preHandle(请求、响应、处理程序);
}
@覆盖
公共完成后作废(HttpServletrequest请求,HttpServletResponse响应,对象处理程序,异常ex)引发异常{
}
}
拦截器可以通过继承org . spring framework . web . servlet . handler . handlerinterceptoradapter来实现;去实现。
执行顺序
因为我们可以配置多个过滤器和拦截器,它们的执行顺序是什么?过滤器的执行顺序与web.xml中的配置顺序有关,首先执行第一个配置,但并不意味着最后一个过滤器完成后会执行下一个。他们通过链条被处决。我画了一个过滤器和拦截器具体执行过程的图,可以看一下。