一、认识Filter
filter(过滤器),文字意思就是对事务进行过滤,在web服务中,使用过滤器就是对请求或进行拦截过滤,做出相应的处理。如请求字符编码、敏感词语和登录管理等等。在页面开发中,有好些许资源的访问都要用上同一部分的代码,为了避免繁琐,就可以用上过滤器,在这些页面中用于拦截。
二、Filter工作原理
我们使用过滤器,是请求和响应都会经过,即浏览器发起的请求和web资源返回的响应,过滤器每次执行都会执行一次doFilter()方法,用以交给下一个过滤器。工作原理如下:
三、Filter使用测试
前期准备的导包什么的就不过多介绍了,就正常的servlet-api.jar包,学到这里了,估计都是懂得了。下面举一个解决乱码问题的过滤器示例:
步骤
-
实现Filter接口,Filter接口有很多,主要一定是要**jakarta.servlet.***包下的(tomcat9以下的就javax.servlet.*包)
package com.yg.filter; import jakarta.servlet.*; import java.io.IOException; //过滤器解决乱码问题 public class CharacterEncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } public void destroy() { } }
-
实现接口就要重写它的的方法,有三个,对应着Filter的生命周期(和Servlet的十分相似)
init() 初始化阶段:当服务器启动时,服务器(Tomcat)就会读取配置文件,创建Filter。
doFilter() 拦截和过滤阶段:如果请求资源的路径符合我们的拦截路径,就会进入我们的过滤器,这个阶段在服务器运行过程中会一直循环。
destroy() 销毁阶段:当服务器(Tomcat)关闭时,服务器创建的Filter也会随之销毁。//过滤器解决乱码问题 public class CharacterEncodingFilter implements Filter { //初始化:web服务器启动时,就开始初始化了 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter 初始化了!"); } //处理部分:过滤功能实现代码块 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;character=UTF-8"); System.out.println("CharacterEncodingFilter执行前..."); filterChain.doFilter(servletRequest,servletResponse); System.out.println("CharacterEncodingFilter执行后..."); } //销毁:web服务器关闭的时候就销毁了 public void destroy() { System.out.println("Filter 销毁了!"); } }
-
使用filterChain参数调取doFilter()交给下一个过滤器使用
/* Chain 1.过滤中的所有代码,在过滤特定请求的时候都会执行 2.要让过滤器继续执行,必须有下面这行代码,用于交给下一个过滤器 filterChain.doFilter(servletRequest,servletResponse); */ System.out.println("CharacterEncodingFilter执行前..."); filterChain.doFilter(servletRequest,servletResponse); System.out.println("CharacterEncodingFilter执行后...");
**补充:**之所以要使用filterChain.doFilter()方法是因为不一定只有一个过滤器,该方法用于将过滤后的内容传给下一个过滤器!过滤器执行循序符合web.xml中配置的先后顺序。此外, Tomcat在调用过滤器时,默认传入Request和Response两个参数封装了请求和响应,可以直接使用。但是其中的方法比较少,可以使用HttpServletRequest和HttpServletResponse进行强制转换,使用相应的方法。
-
在web.xml中注册filter
<!-- filter注册-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.yg.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/Show/*</url-pattern><!-- 指/Show以下的请求都会经过过滤器-->
</filter-mapping>
servlet测试代码如下:
package com.yg.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
//CharacterEncodingFilter 测试代码
public class FilterDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("过滤器,你好鸭!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
以上就是我的全部内容了,赶快打开编译器实操一下吧!掌握以上内容,基本就懂得使用Filter了,Filter的功能很多地方都可以用上,想要更深入的学习,就尝试一下登录管理权限的设置吧~