JavaWeb三大组件啊-Filter

一、Filter 过滤器简介

过滤器可以对访问的静态资源和动态资源进行过滤,既可以过滤请求,也可以过滤响应

1.应用场景列举
  • 统一编码处理
  • 登入验证
  • 敏感字符过滤
    ![[Pasted image 20250422121326.png]]
    相当于在 Client 和 Server 之间创建了一个中间层 Filter, 先经过Filter再到Server
2.使用

先创建实现类,来实现 javax.servlet.Filter包的接口,实现后有以下几个抽象方法

方法 说明
void init(FilterConfig filterConfig) 过滤器对象创建的时候调用的方法
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 执行的过滤方法,每次访问的拦截的资源,都会执行该方法
void destory() 过滤器销毁的时候调用的方法
补充 doFilter成员参数
  • request - 请求 - 不支持http
  • response - 响应 - 不支持http
  • chain - 过滤器链 - 如果可以访问过滤资源,则书写过滤器链对象.doFilter() ,反之不写

配置 Filter ,有两种方式,第一种是xml,第二种是注解,重点讲注解

配置方式一、xml配置

在web资源路径下,有一个web.xml ,在里面配置以下标签

  <filter>
    <filter-name>自定义过滤器名称filter-name>
    <filter-class>实现了过滤器的实现类路径filter-class>
  filter>
  
  <filter-mapping>
    <filter-name>配置filter标签定义的过滤器名称filter-name>
	<url-pattern>要进行过滤的资源地址url-pattern>
  filter-mapping>

3.底层实现

配置方式二、注解开发

使用注解开发就不需要配置xml了,只需要在对应的过滤器实现类顶部,使用

@WebFilter("/过滤的资源路径")

3.配置 filter模板

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
import javax.servlet.annotation.WebFilter;
import javax.servlet.FilterConfig;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.annotation.WebFilter;  
import javax.servlet.*;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;

@WebFilter("/${Entity_Name}")
public class ${Class_Name} implements javax.servlet.Filter {

  public void init(FilterConfig config) throws ServletException {  
  
  }  
  public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {  
	  HttpServletRequest request = (HttpServletRequest) servletRequest;  
      HttpServletResponse response = (HttpServletResponse) servletResponse;  
        
      //放行  
	  chain.doFilter(servletRequest, servletResponse);  
  }  
  
  public void destroy() {  
      }
}
4.Filter生命周期
  • a.启动tomcat时,tomcat调用过滤器的无参构造创建过滤器对象
  • b.然后使用过滤器对象调用 init 来进行初始化
  • c.每次访问被过滤的资源的时候,都要执行 doFilter 方法
  • d.关闭 tomcat 服务器之前,使用过滤器对象调用 destroy(销毁方法)
5.拦截路径
精确匹配

用户访问指定的资源路径,过滤器进行过滤

@WebFilter("/index.html")
目录匹配

用户访问指定目录下所有资源的时候,过滤器进行拦截

@WebFilter("/user/*")
后缀匹配

用户访问指定后缀名的资源的时候,过滤器进行拦截,不能加/

@WebFilter("*.html")
匹配所有 - >最重要

用户访问所有资源的时候,过滤器进行拦截

@WebFilter("*")

当多个过滤器对象都指定了一个资源,那会执行所有满足条件的过滤器

6.过滤器链

指的是当前路径指定了多个过滤器,他们会像一条链子一样组合起来
JavaWeb三大组件啊-Filter_第1张图片

如果其中一个没有放行,那就不会执行到下一个过滤器

小结:
1.前提条件:多个过滤器在同一个包下过滤器统一资源有如下过滤(注解开发)

  • 执行顺序按照过滤器类的字母升序执行(第一个一样就比第二个以此类推)
    2.如果是xml配置方式,多个过滤器过滤统一资源
  • 按照在xml中执行的顺序执行
案例1.解决全站乱码

在以前,都是在每个请求和响应中书写以下代码来处理编码问题,所以相冗余

response.setContentType("text/html;charset=utf-8");

所以有了新方案,以后这些代码就书写在过滤器中,均写在doFilter中

    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    //放行
    chain.doFilter(servletRequest, servletResponse);
案例2.登入权限校验

在Servlet中 无论传入啥,直接封装到对象存session

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        response.setContentType("text/html;charset=utf-8");
        // 模拟使用数据库查询后
        if (username.equals("admin") && password.equals("123")){
            System.out.println("登入成功");
            HttpSession session = request.getSession();
            session.setAttribute("u",new User(username,password));
            response.sendRedirect("/hack.html");
        }
    }

在Filter中

HttpServletRequest request = (HttpServletRequest) servletRequest;  
HttpServletResponse response = (HttpServletResponse) servletResponse;  
HttpSession session = request.getSession();  
User user = (User)session.getAttribute("u");  
if (user!=null) chain.doFilter(servletRequest, servletResponse);  
else response.sendRedirect("/login.html");

如果不等于null,就放行,不然就重定向回登入页面

你可能感兴趣的:(filter,java)