javaWeb过滤器Filter(二)

简介: javaWeb过滤器Filter(二)

一、FilterChain 过滤器链

多个Filter对同一个资源进行拦截就可以形成过滤器链,同一个资源是指的匹配路径一致

多个Filter过滤器是根据配置的顺序来执行,谁在前,先执行谁

二、Filter的生命周期

1、生命周期流程

和servlet 生命周期类似:实例化-》初始化->服务-》销毁

Filter的生命周期

服务器启动时,会创建Filter对象, 并调用init方法,只调用一次

当访问资源的时,路径与Filter的拦截路径匹配,会执行Filter的doFilter方法

当服务器关闭时,会调用Filter 的destroy方法进行销毁

2、代码展示

package com.heihei;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter{
  @Override
  public void destroy() {
    System.out.println("Filter destroy ");
  }
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    System.out.println("拦截开始");
    //放行
    chain.doFilter(request, response);
    System.out.println("结束拦截,资源过滤后,回来了");
  }
  @Override
  public void init(FilterConfig arg0) throws ServletException {
    System.out.println("Filter init ");
  }
}

三、FilterConfig对象说明

Filter初始化方法init上的一个参数 ,就是FilterConfig对象

public interface Filter {
    void init(FilterConfig var1) throws ServletException;
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
    void destroy();
}

MyFilterConfig

package com.heihei;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilterConfig implements Filter{
  private FilterConfig config;
  @Override
  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }
  @Override
  public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain)
      throws IOException, ServletException {
    //通过FilterConfig对象获取配置文件中的初始化信息
    String coding = config.getInitParameter("encoding");
    System.out.println(coding);
    req.setCharacterEncoding(coding);
    chain.doFilter(req, rsp);
  }
  @Override
  public void destroy() {
    // TODO Auto-generated method stub
  }
}

ServletDemo

package com.heihei;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo extends HttpServlet{
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("ServletDemo");
  }
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    super.doPost(req, resp);
  }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <filter>
    <filter-name>MyFilterConfig</filter-name>
    <filter-class>com.heihei.MyFilterConfig</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>    
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFilterConfig</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>com.heihei.ServletDemo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/ServletDemo</url-pattern>
  </servlet-mapping>
</web-app>

四、Filter配置

1、匹配规则

在web.xm文件中,<url-pattern>标签的匹配规则:
完全匹配   以"/demo",不包含通配符
目录匹配    以"/"开头,以"*"结束
扩展名匹配:   *.xxxx,不能写成 /*.xxx ,比如 *.do

2、servlet-name 标签

也可以直接通过配置<servlet-name>标签,来关联到servlet对应的servlet-mapping配置,从而达到拦截的目的
<filter-mapping>
    <filter-name>MyFilterConfig</filter-name>
  <servlet-name>ServletDemo</servlet-name>
  </filter-mapping>

3、dispatcher 标签

<dispatcher>标签,默认是request请求,可以写多个dispatcher标签,比如:
 <filter-mapping>
    <filter-name>MyFilterConfig</filter-name>
    ****
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
REQUEST:默认值,只过滤客户端请求和重定向
FORWARD:只过滤转发请求


相关文章
|
2月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4月前
|
SQL 前端开发 Java
JavaWeb 学习日记案例详解及 javaweb 完整项目案例实战指南
本文介绍了一个基于Spring Boot的JavaWeb企业员工管理系统完整案例,涵盖部门管理、员工管理、登录、异常处理、事务管理及AOP等核心功能实现,结合CSDN相关技术文章,提供详细技术方案与应用实例,适合JavaWeb开发者学习与参考。
194 0
|
10月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
194 4
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
199 1
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
122 2
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
505 5
|
移动开发 JavaScript 前端开发
Javaweb之Vue路由的详细解析
Vue.js是一款备受欢迎的前端框架,以其简洁的API和组件化开发模式著称。Vue Router作为其官方路由管理器,在构建单页面应用(SPA)时发挥关键作用,通过URL变化管理组件切换,实现无刷新过渡。本文将详细介绍Vue Router的基础概念、主要功能及使用步骤,帮助JavaWeb开发者快速掌握其工作原理及实践应用。
112 1
|
JSON JavaScript 前端开发
Javaweb中Vue指令的详细解析与应用
Vue指令提供了一种高效、声明式的编码方式,使得开发者可以更专注于数据和业务逻辑,而不是DOM操作的细节。通过熟练使用Vue指令,可以极大地提高开发效率和项目的可维护性。
109 3
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
422 2
|
JavaScript 前端开发 UED
Javaweb中Vue指令的详细解析与应用
Vue指令是Vue框架中非常强大的特性之一,它提供了一种简洁、高效的方式来增强HTML元素和组件的功能。通过合理使用这些指令,可以使你的JavaWeb应用更加响应用户的操作,提高交互性和用户体验。而且,通过创建自定义指令,你可以进一步扩展Vue的功能,使其更贴合你的应用需求。
116 1
下一篇
oss云网关配置