7.2 过滤器 Filter
Filter:过滤网站数据的 过滤器。
- 比如处理中文乱码
- 登录验证
这个过滤器 在后台也是个程序,只不过是要 去实现 过滤器接口。
首先我们要知道的是,这个 接口 我们一定不要 导入 错了。
Tomcat 10 支持的 Filter 接口是 jakarta 下面的。
然后我们 会发现 要重写 三个 方法,初始化
过滤
销毁
-
初始化
一般 都是在 真正 执行 servlet 程序之前 需要做关于数据的相关什么。 -
过滤
一般是在 servlet 程序执行之前 做什么 过滤的处理,比如说 登录的验证、编码的转化、这些 。。 -
销毁
就是在销毁的时候 要做什么 事情!
那么我们 可以 做一个 示范,比如说以前我们 处理中文乱码问题,都是写在 每个 servlet 程序里面的,这次我们直接 写在 Filter 程序里。
package com.muquanyu.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter 已被初始化!");
//Filter.super.init(filterConfig);
}
//过滤器要做的事
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html");
servletResponse.setCharacterEncoding("utf-8");
System.out.println("CharacterEncodingFilter 执行前......");
//Chain 链
//让我们的请求 继续走,如果不写程序到这里就被拦截终止了。
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("CharacterEncodingFilter 执行后......");
}
//销毁:web服务器关闭后,过滤器才会被销毁!
@Override
public void destroy() {
System.out.println("CharacterEncodingFilter 已销毁!");
//Filter.super.destroy();
}
}
filterChain.doFilter(servletRequest,servletResponse);
这条代码 是干什么的呢。它 意指 链起来,就是说 当我们 过滤完一个之后,如果你还想 继续过滤,那么就必须 调用这条代码。因为我们知道每个请求都是不一样的。我们肯定要有一个方法来接收每次都不一样的请求和响应!!
这样才能再次进行请求和响应的过滤!所以这条代码是必须要写的!如果不写,程序就执行到这里 终止了。。。这算是一个 使用规则。
那么 我们 过滤器代码写完了,难道 直接就可以用吗?
我们是不是 要声明一下 该过滤器 应用于 哪些 请求地址呀?只有做了 这个声明,我们的过滤器 才知道用到哪里。要不然不就白写了吗。
所以过滤器 在 web.xml 里面 也要写一下 它自己的配置。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.muquanyu.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
意思就是说 该过滤器,应用于 /servlet/ 下面的 所有请求地址,只要是 关于 这个 地址的,我们 就必须要 先经过 过滤器 对 请求和 响应 甚至是 一些 数据 做 提前的处理。然后才能 去执行 Servlet 程序。
- Servlet 中文乱码程序
package com.muquanyu.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ShowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("我是中文!");
//super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
}
- 为了作为过滤器是否有作用 的区分,我们把这个 servlet 程序设定两种 url 请求。
<servlet>
<servlet-name>ShowServlet</servlet-name>
<servlet-class>com.muquanyu.servlet.ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowServlet</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
一个是 /show , 一个是 /servlet/show
我们知道 我们写的过滤器 只对 servlet/show 会进行 响应的 过滤处理,而不会 对 show 进行 过滤处理,所以 访问 show 的时候 显示的应该是 中文乱码,而 经过 过滤器 处理的 servlet/show 则是 正常的中文 显示给我们!!!
当服务器被关掉后,自动会执行 销毁的 那个 方法。
如此看来,Filter 过滤器 也不过如此。它 好像类似于 一个 公共的 预处理 程序,为我们 提前处理 各种问题。