filter
- 1、入门
- 2、生命周期
- 3、执行顺序问题
- 4、注解
1、入门
UserServlet.java
package com.cky.servlet;import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;//配置多个url路径 使用value 是一样饿效果
@WebServlet(urlPatterns ={"/s1","/s2"},name="servlet1")
public class UserServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("a");}}
Myfilter.java
package com.cky.filters;import jakarta.servlet.*;import java.io.IOException;public class Myfilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//做三件事/*1、在请求到达目标资源之前的代码 比如登录校验等2、放行3、请求返回给客户端之前的代码*/System.out.println("filterChain.doFilter before");filterChain.doFilter(servletRequest,servletResponse);System.out.println("filterChain.doFilter after");}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><!-- <context-param>-->
<!-- <param-name>code</param-name>-->
<!-- <param-value>i</param-value>-->
<!-- </context-param>--><filter><filter-name>myfilter</filter-name><filter-class>com.cky.filters.Myfilter</filter-class></filter><filter-mapping><filter-name>myfilter</filter-name>
<!-- servlet -name 是servlet的别名 而不是访问地址--><servlet-name>servlet1</servlet-name>
<!-- 这里也可以是模糊也可以是请确匹配-->
<!-- url 是servlet 的访问地址-->
<!-- <url-pattern>/s1</url-pattern>--></filter-mapping>
</web-app>
输出:
filterChain.doFilter before
a
filterChain.doFilter after
我们可以打断点尝试,在我们访问servlet时,会先经过dofilter方形之前的代码,然后执行我们的目标代码,之后再执行放行之后的代码。
注意:
导入的filter 是import jakarta.servlet.*; 包下的
2、生命周期
构造 只构造1次 在项目启动时构造
初始化 初始化一次,构造完成之后就立即初始化
dofilter 多次,每次调用
销毁 项目关闭时 只销毁一次。
与servlet的不同之处:
servlet 可以在web.xml文件的标签中添加 </load-on-
startup> 标签,标签中间填写的是整数,正整数表示在服务器加载时创建,值越小优先级越高,负整数或者不填表示第一次访问时创建。
而filter 不能选择,都是在项目启动时创建。
可以在filter中初始化参数
<filter><filter-name>myfilter</filter-name><filter-class>com.cky.filters.Myfilter</filter-class><init-param><param-name>key</param-name><param-value>value</param-value></init-param></filter><filter-mapping><filter-name>myfilter</filter-name>
<!-- servlet -name 是servlet的别名 而不是访问地址--><servlet-name>servlet1</servlet-name>
<!-- 这里也可以是模糊也可以是请确匹配-->
<!-- url 是servlet 的访问地址-->
<!-- <url-pattern>/s1</url-pattern>--></filter-mapping>
package com.cky.filters;import jakarta.servlet.*;import java.io.IOException;public class Myfilter implements Filter {public Myfilter(){System.out.println("构造");}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println(filterConfig.getInitParameter("key"));}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("dofilter");}@Overridepublic void destroy() {System.out.println("销毁");}
}
3、执行顺序问题
在web.xml 配置中 如果有多个多滤器就是按照filter-mapping的顺序执行的,哪个在前,先执行哪个filter。
如果是通过注解的方式,则就是按照filter的名称。比如F1_filter,F2_filter,则就是F1 这个先执行。
4、注解
@WebFilter(urlPatterns = "/servlet1",initParams =
{@WebInitParam(name = "key",value = "v")},
servletNames = "")
value与urlPatterns 是一样的,不过当urlPatterns 只有一个时,可以省略urlPatterns 不写。