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 {
@Override
protected 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 {
@Override
public 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("构造");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println(filterConfig.getInitParameter("key"));
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("dofilter");
}
@Override
public 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 不写。