一、过滤器的配置

  • 首先,从认知方面看,如果自己真的对Filter和Intercepter 不熟悉或者忘记的话可以自己在IDEA中编写Demo进行查看两个的区别,这也是自己动手去认知的过程。首先从Filter开始
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("TestFilter init 完成");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行TestFilter doFIlter");
} @Override
public void destroy() {
System.out.println("TestFilter destroy");
}
}

以上代码在项目启动的时候会初始化FIlter。



ps:如果Filter要使请求继续被处理,就一定要调用filterChain.doFilter()!

代码很直观的看出Filter是基于Servlet。我们点击Filter的源码进行查看,看看里面是干了什么。比如注释什么的解释的很清楚。执行流程如下:

过滤器的应用场景:

以下是来自Filter的官方解释

Filters are configured in the deployment descriptor of a web application

Examples that have been identified for this design are

  1. Authentication Filters //身份验证过滤器
  2. Logging and Auditing Filters // 记录和审计过滤器
  3. Image conversion Filters // 图像转换过滤器
  4. Data compression Filters //数据压缩过滤器
  5. Encryption Filters //加密过滤器
  6. Tokenizing Filters //标记过滤器
  7. Filters that trigger resource access events //触发资源访问事件的过滤器
  8. XSL/T filters //XSLT 过滤器
  9. Mime-type chain Filter
  • 配置Filter交给Spring管理

    方式1

    使用@Component+@Order

    在TestFilter 类上加@Compoent 和@Order(1) 注解 即可把当前的Filter交给Spring管理。当有多个Filter时,这里的@Order(1)注解会指定执行顺序,数字越小,越优先执行,如果只写@Order,默认顺序值是Integer.MAX_VALUE。

@Component + @Order 注解方式配置简单,支持自定义 Filter 顺序。缺点是只能拦截所有URL,不能通过配置去拦截指定的 URL。

方式2

使用@WebFilter+@ServletComponentScan

@ServletComponentScan 可加在当前Filter类上,也可加在启动类上。

方式3

使用javaConfig配置类


@Configuration
public class FilterConfig {
@Bean
public FilterBean filterBean(){
FilterBean <TestFilter> bean = new FilterBean<>();
bean.setOrder(1);
bean.setFilter(new TestFilter());
// 匹配"/test/"下面的所有url
bean.addUrlPatterns("/test/*");
return bean;
}
@Bean
public FilterBean2 filterBean2(){
FilterBean2 <TestFilter2> bean = new FilterBean2<>();
bean.setOrder(2);
bean.setFilter(new TestFilter2());
// 匹配所有url
bean.addUrlPatterns("/*");
return bean;
}
}

使用@Component/@Order 注解 和 使用Config配置Filter的对比

首先定义两个Filter ,一个是使用@Component/@Order 一个是使用配置文件FilterRegistrationBean

@Component
@Order(-1)
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("TestFilter init 完成");
}
/**
* 需要忽略的地址
*/
private static final String[] IGNORES = new String[]{
"/"
};
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("TestFilter Execute cost="+(System.currentTimeMillis()-start));
} @Override
public void destroy() {
System.out.println("TestFilter destroy销毁");
}
}

FilterRegistrationBeanConfig配置类

@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new LogCostFilter());
registration.addUrlPatterns("/*");
registration.setName("LogCostFilter");
registration.setOrder(2);
return registration;
} } public class LogCostFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Execute cost="+(System.currentTimeMillis()-start));
}
}

执行结果是根据设置的优先级来的。

注意说明:使用@WebFilter注解的属性

属性名 类型 描述
filterName String 指定过滤器的 name 属性,等价于filter-name
value String[] 该属性等价于 urlPatterns 属性。但是两者不应该同时使用
urlPatterns String[] 指定一组过滤器的 URL 匹配模式。等价于 标签。
servletNames String[] 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 的取值。
dispatcherTypes DispatcherType 指定过滤器的转发模式。具体取值包括: ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParams WebInitParam[] 指定一组过滤器初始化参数,等价于 标签。
asyncSupported boolean 声明过滤器是否支持异步操作模式,等价于 标签。
description String 该过滤器的描述信息,等价于 标签。
displayName String 该过滤器的显示名,通常配合工具使用,等价于 标签。

执行顺序

比如:

encodingFilter.java

permissionFilter.java

先执行encodingFilter.java在执行permissionFilter.java

二、拦截器的配置

  • 首先我们实现拦截器类:
public class TestInterceptor implements HandlerInterceptor {
long start = System.currentTimeMillis();
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
start = System.currentTimeMillis();
return true;
} @Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));
} @Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}

这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,

  1. preHandle是请求执行前执行的,
  2. postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,
  3. afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作。除了实现上面的接口外,我们还需对其进行配置:
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}

这里我们继承了WebMVCConfigurerAdapter,在进行静态资源目录配置的时候我们用到过这个类。这里我们重写了addInterceptors这个方法,进行拦截器的配置,主要配置项就两个,一个是指定拦截器第二个是指定拦截的URL。现在我们再启动系统访问任意一个URL即可。

java中的Filter(过滤器)和Intercepter(拦截器)的认知的更多相关文章

  1. Java 中的 Filter 过滤器详解

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  2. Java中的Filter过滤器

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  3. Filter(过滤器)与Interceptor(拦截器)的区别

    Filter能够对请求和响应资源进行拦截: Interceptor只针对请求进行拦截 在 Struts2中: (1)拦截器是基于java反射机制的,而过滤器是基于函数回调的. (2)过滤器依赖与ser ...

  4. Servlet中的Filter 过滤器的简单使用!

    package com.aaa.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servle ...

  5. Java过滤器与SpringMVC拦截器的差异学习笔记

    学习摘录地址:http://blog.csdn.net/chenleixing/article/details/44573495 今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了 ...

  6. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

  7. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  8. Java防止SQL注入2(通过filter过滤器功能进行拦截)

    首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...

  9. Java进阶知识02 Struts2下的拦截器(interceptor)和 过滤器(Filter)

    一.拦截器 1.1.首先创建一个拦截器类 package com.bw.bms.interceptor; import com.opensymphony.xwork2.ActionContext; i ...

  10. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

随机推荐

  1. RabbitMQ消息队列入门及解决常见问题

    RabbitMQ消息队列 同步通讯和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应. 异步通讯:就像发邮件,不需要马上回复. 两种方式各有优劣,打电话可以立即得到响应 ...

  2. drf-day6——九个视图子类、视图集、路由系统、认证组件

    目录 一.九个视图子类 二.视图集 2.1 通过ModelViewSet编写5个接口 2.2 通过ReadOnlyModelViewSet编写2个只读接口 2.3 ViewSetMixin源码分析 总 ...

  3. JSP第五次作业

    1.教材P78-79  例4-9 1 <%@ page language="java" import="java.util.*" pageEncoding ...

  4. FAQ selenium无法click的一个案例分享(2)

    案例描述 https://www.healthsmart.com.hk/hs-home/#!/link/home 来着学员咨询 这个网页你手工打开的时候你会发现一直处于加载中,一定时间后才好. 我们的 ...

  5. DataGrid 设置某列可见或只读

    在ASP.NET中使用 DataGrid数据展示控件时,可以对数据进行展示,编辑,删除,在有些时候不希望某列被修改,进行如下设置 点击编辑后 想要如下效果  其中权限编码和权限分类不希望修改 设置方法 ...

  6. windows10、windows server 2016激活方法

    1.激活准备 管理员打开cmd命令窗口(或者Windows+X组合键选择下图标注选项),复制对应版本命令回车即可 2.激活命令: 2.1 win 10 专业版 slmgr /ipk W269N-WFG ...

  7. 举例说明postman接口测试

    接口测试的本质就是接口的数据和数据库里的数据作对比 接口测试,可以理解为测的是后端的程序,而系统测试的时候,测试的是前端的程序,前端只有在满足条件的时候才会调到接口,所以接口测试可以测得更全面更准确 ...

  8. P21_事件传参与数据同步

    事件绑定 在事件处理函数中为 data 中的数据赋值 通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值,示例如下: 事件传参 小程序中的事件传参 ...

  9. JZOJ 100149. 一道联赛A题

    \(\text{Solution}\) 一眼 \(ODT\) 为避免每次都数颜色数量,提前记录下来,每次修改更新下 \(\text{Code}\) #include <cstdio> #i ...

  10. 解决ssh连接远程主机出现“REMOTE HOST IDENTIFICATION HAS CHANGED”问题

    Win通过ssh连接远程主机 命令提示符方式 ssh username@ip 此后输入你的密码 通过VSCode Remote-SSH 在VSCode拓展中搜索"Remote-SSH&quo ...