一文带你超详细了解 Filter 的原理及应用 filter是什么意思

filter是什么意思(一文带你超详细了解 Filter 的原理及应用)Filter 简介
什么是 filter
1) Filter(过滤器) 的基本功能是对 Servlet 容器调用 Servlet (JSP)的过程进行拦截 , 从而在 Servlet 处理请求前和Servlet 响应请求后实现一些特殊的功能 。
2) 在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序: Filter,FilterChain, FilterConfig
3) Filter 程序是一个实现了 Filter 接口的 Java 类 , 与 Servlet 程序相似 , 它由 Servlet容器进行调用和执行
4) Filter 程序需要在 web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件
filter 的运行原理是什么

一文带你超详细了解 Filter 的原理及应用 filter是什么意思

文章插图

这个 Servlet 过滤器就是我们的 filter
1)当在 web.xml 中注册了一个 Filter 来对某个 Servlet 程序进行拦截处理时 , 这个Filter 就成了 Tomcat 与该 Servlet 程序的通信线路上的一道关卡 , 该 Filter 可以对Servlet 容器发送给 Servlet 程序的请求和 Servlet 程序回送给 Servlet 容器的响应进行拦截 , 可以决定是否将请求继续传递给 Servlet 程序 , 以及对请求和相应信息是否进行修改
2)在一个 web 应用程序中可以注册多个 Filter 程序 , 每个 Filter 程序都可以对一个或一组 Servlet 程序进行拦截 。
3)若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截 , 当针对该 Servlet 的访问请求到达时 , web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链) 。 Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致
Filter-helloword
Hello-World
filter 编写三步骤:
1、创建 filter 实现类 , 实现 filter 接口
2、编写 web.xml 配置文件 , 配置 filter 的信息
3、运行项目 , 可以看到 filter 起作用了
代码:
//1、filter 实现类
public class MyFirstFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws
IOException, ServletException {
System.out.println("dofilter方法");
}
@Override
public void destroy() {
System.out.println("销毁方法...");
}
}
//2、web.xml 配置
MyFirstFilter
com.atguigu.filter.MyFirstFilter
MyFirstFilter
/index.jsp
//3、运行程序 , 发现 index.jsp 页面不显示了 , 后台输出“dofilter 方法” , 说明我们写的 filter 执行了 。
【一文带你超详细了解 Filter 的原理及应用 filter是什么意思】filter 的生命周期
1)在服务器启动时 , filter 被创建并初始化 , 执行 init()方法 。
2)请求通过 filter 时执行 doFilter 方法 。
3)服务器停止时 , 调用 destroy 方法 。
filter 放行请求
我们发现 , 刚才的 filter 配置好后 , index.jsp 页面没法访问了 , 访问这个页面的时候 filter的 dofilter 方法被调用了 。 说明dofilter 这个方法拦截了我们的请求 。
我们如何显示页面呢 。 也就是如何将请求放行呢 。 我们观察发现有个 filterChain 被传入到这个方法里面了 。 filterChain 里面有个 doFilter()方法 。 放行请求只需要调用 filterChain 的 dofilter 方法 。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {
System.out.println("dofilter方法");
chain.doFilter(request, response);//放行请求
}
filter 拦截原理
我们在 chain.doFilter(request, response);方法后也写一句话 , System.out.println
(“doFilter 方法执行后…”) , 在 index.jsp 页面也写上 jsp 脚本片段 , 输出我是 jsp 页面 。 运行程序发现控制台输出了这几句话:
dofilter 方法… 我是 jsp 页面
dofilter 方法后…
我们不难发现 filter 的运行流程
一文带你超详细了解 Filter 的原理及应用 filter是什么意思

文章插图

FilterChain
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
在 doFilter 执行之前 , 由容器将 filterChain 对象传入方法 。 调用此对象的.doFilter()方法可以将请求放行 , 实际上是执行过滤器链中的下一个 doFilter 方法 , 但是如果只有一个过滤器 , 则为放行 。

推荐阅读