Filter 过滤器

简介

  • Filter 过滤器是 JavaWeb 三大组件之一
  • Filter 过滤器是 JavaEE 的规范,也就是接口
  • Filter 过滤器的作用是 拦截请求,过滤响应

拦截请求的常见应用场景:

  • 权限检查
  • 日志操作
  • 事务管理

使用步骤

使用步骤

  • 编写一个类去实现 Filter 接口
  • 实现过滤方法 doFilter()
  • 到 web.xml中配置 Filter 的拦截路径,或者用注解配置

Filter 的工作流程图:

使用实例

实现一个完整的用户登录

login.jsp 页面,登录表单:

这是登录页面。login.jsp 页面 <br>
<form action="http://localhost:8080/15_filter/loginServlet" method="get">
用户名:<input type="text" name="username"/> <br>
密 码:<input type="password" name="password"/> <br>
<input type="submit" />
</form>

LoginServlet 程序:

public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
resp.setContentType("text/html; charset=UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("parzulpan".equals(username) && "123456".equals(password)) {
req.getSession().setAttribute("user",username);
resp.getWriter().write("登录 成功!!!");
} else {
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}
}
}

AdminFilter 过滤器:

package cn.parzulpan.web;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException; /**
* @Author : parzulpan
* @Time : 2020-12-13
* @Desc :
*/ public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { } // doFilter 方法,专门用于拦截请求,可以做权限检查
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
// 如果等于 null,说明还没有登录
if (user == null) {
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
} else {
// 让程序继续往下访问用户的目标资源
filterChain.doFilter(servletRequest,servletResponse);
}
} @Override
public void destroy() { }
}

web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>cn.parzulpan.web.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!--url-pattern 配置拦截路径
/ 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
</web-app>

生命周期

Filter 的生命周期包含几个方法:

  • 第 1 步,构造器方法
  • 第 2 步,init 初始化方法
    • 第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建)
  • 第 3 步,doFilter 过滤方法
    • 第 3 步,每次拦截到请求就会执行
  • 第 4 步,destory 销毁方法
    • 第 4 步,停止 web 工程的时候就会执行(停止 web 工程也会销毁 Filter 过滤器)

FilterConfig 类

FilterConfig 类是 Filter 过滤器的配置文件类,Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,它包含了 Filte 配置文件的配置信息。

FilterConfig 类的作用是获取 Filter 过滤器的配置内容:

  • filterConfig.getFilterName() 获取 Filter 的名称 Filter-name 的内容
  • filterConfig.getInitParameter(String param) 获取在 Filter 中配置的 init-param 初始化参数
  • filterConfig.getServletContext() 获取 ServletContext 对象

FilterChain 过滤器链

Filter 是过滤器,Chain 是链条,FilterChain 就是过滤器链,指多个过滤器一起工作。

FilteChain.doFilter() 的使用:

  • 如果有 Filter,则执行下一个 Filter 过滤器
  • 如果没有 Filter,则执行目标资源
  • 有 多个 Filter 的情况下,它们的执行的优先顺序是由 web.xml 中从上到下配置的顺序决定

多个 Filter 执行的特点:

  • 所有的 Filter 和目标资源默认都执行在同一个线程下
  • 多个 Filter 共同执行的时候,它们都是使用同一个 Request 对象

Filter 拦截路径配置

  • 精确匹配

    • <url-pattern>/target.jsp</url-pattern> 表示请求地址必须是 http://ip:port/工程路径/target.jsp 才会被拦截
  • 目录匹配
    • <url-pattern>/admin/*</url-pattern> 表示请求地址必须是 http://ip:port/工程路径/admin/* 才会被拦截
  • 后缀名匹配
    • <url-pattern>*.html</url-pattern> 表示请求地址必须以 .html 结尾才会拦截
    • <url-pattern>*.do</url-pattern> 表示请求地址必须以 .do 结尾才会拦截
    • <url-pattern>*.action</url-pattern> 表示请求地址必须以 .action 结尾才会拦截

注意:Filter 过滤器只关心请求的地址是否被匹配,不关心请求的资源是否存在。

总结和练习

【JavaWeb】Filter 过滤器的更多相关文章

  1. JavaWeb——Filter过滤器

    1.Filter的目的 Filter用于在Servlet之前检测和修改请求和响应,它可以拒绝.重定向或转发请求.常见的有这几种: 日志过滤器 使用过滤器记录请求,提供请求日志记录,还可以添加追踪信息用 ...

  2. JavaWeb基础—过滤器Filter

    一.概念 JavaWeb三大组件之一(组件都有一个特性,需要在web.xml中配置) 过滤器:会在一组资源(jsp servlet等)的前面执行,可以让请求得到目标资源,也可以终止请求,不再继续 也就 ...

  3. javaweb学习总结(四十二)——Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. javaWeb学习总结(10)- Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...

  5. JavaWeb(五)Filter过滤器

    Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...

  6. javaweb之Filter过滤器详解

    快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...

  7. JavaWeb学习篇--Filter过滤器

    Filter过滤器简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的 java 类实现了这个接口,则把这个java类称之为过滤器Filter. WEB服务器每次在调用 ...

  8. Filter(过滤器)常见应用

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...

  9. Filter(过滤器)

    一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...

随机推荐

  1. 题解-CF1396C Monster Invaders

    题面 CF1396C Monster Invaders 有 \(n\) 层关卡,每层有 \(a_i\) 个小怪(\(1\) 血)和 \(1\) 个老怪(\(2\) 血).有三种武器:\(1\) 武器每 ...

  2. 算法——和为K的连续子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况. 链 ...

  3. 20201203-6 设置excel样式【】

    1-1 1 import os 2 from openpyxl import load_workbook 3 from openpyxl.styles import PatternFill, Alig ...

  4. gnuplot设置字体及大小

    set term png font 'times.ttf,14'set fontpath '/home/peter/.fonts'set output 'vel-cost.eps'set gridse ...

  5. 【Go语言绘图】图片的旋转

    在上一篇中,我们了解了gg库的基本使用,包括调整大小.调整圆形参数.设置颜色.保存图片.加载图片和裁剪.这一篇我们来学习一下图片的旋转. 加载图片 首先,我们先来一张黄图. func TestRota ...

  6. 微服务开发的最大痛点-分布式事务SEATA入门简介

    前言 在微服务开发中,存在诸多的开发痛点,例如分布式事务.全链路跟踪.限流降级和服务平滑上下线等.而在这其中,分布式事务是最让开发者头痛的.那分布式事务是什么呢? 分布式事务就是指事务的参与者.支持事 ...

  7. Python自动化测试入门必读(最新)

    入门自动化测试必读 自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期 ...

  8. babel 与 ast

    什么是 babel Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 什 ...

  9. Web服务器-服务器开发-返回固定页面的HTTP服务器(3.3.1)

    @ 目录 1.注意 2.代码 关于作者 1.注意 浏览器解析的时候偶\r\n才算一个换行符 发送的str要编码,这里使用的是utf8 其他的都和上一篇没有什么区别 这里主要返回的是固定的网址 2.代码 ...

  10. 带你探究Python的诞生和由来

    最近,Python语言越来越火,那什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?下面,跟着我的步伐,一起去了解一下吧~ Python 诞生在一个圣诞节 P ...