JavaWeb——过滤器Filter

本文介绍了JavaWeb中过滤器Filter的功能,包括拦截请求和响应、XML与注解配置方式,详细解析了Filter的生命周期,并提供了多个使用场景,如统一处理中文乱码、屏蔽敏感词和控制资源访问权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 功能

1.1 功能介绍

  • 用来拦截传入的请求和传出的响应。
  • 修改或以某种方式处理正在客户端和服务端之间交换的数据流。

1.2 使用方法

与使用Servlet类似,Filter是Java WEB提供的一个接口,开发者只需要自定义一个类并且实现该接口即可。

2. 配置

2.1 方法1 xml配置

xml

<filter>
	<!-- 过滤器的名字 -->
	<filter-name>character</filter-name>
	<!-- 过滤器所对应的url -->
	<filter-class>filter.CharacterFilter</filter-class>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
	<filter-name>character</filter-name>
	<url-pattern>/Login</url-pattern>
	<url-pattern>/test</url-pattern>
</filter-mapping>

CharacterFilter

public class CharacterFilter implements Filter{
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		servletRequest.setCharacterEncoding("utf-8");
		filterChain.doFilter(servletRequest, servletResponse);
	}
}

注: doFilter方法中处理完业务逻辑之后必须添加filterChain.doFilter(servletRequest, servletResponse);否则请求/响应无法向后传递,一直停留在过滤器中。

2.2 方法2 注解

@WebFilter("Login")

3. Filter生命周期

3.1 测试代码

加上2.1中的代码

package filter;

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 CharacterFilter implements Filter{

	public CharacterFilter() {
		System.out.println("通过无参数构造创建了对象");
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory...");
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("doFilter...");
		servletRequest.setCharacterEncoding("utf-8");
		filterChain.doFilter(servletRequest, servletResponse);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init...");
	}

}

3.2 结果展示

配置完成后,当Tomcat启动时,通过反射机制调用Filter的无参构造函数创建实例化对象,同时调用init方法执行初始化操作。

在这里插入图片描述
中间可以很多次调用doFilter方法。

在这里插入图片描述

当关掉Tomcat服务后,便会调用destory方法,来销毁Filter对象。

在这里插入图片描述

3.3 两个Filter的调用顺序

<filter>
	<!-- 过滤器的名字 -->
	<filter-name>character</filter-name>
	<!-- 过滤器所对应的url -->
	<filter-class>filter.CharacterFilter</filter-class>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
	<filter-name>character</filter-name>
	<url-pattern>/Login</url-pattern>
	<url-pattern>/test</url-pattern>
</filter-mapping>

<filter>
	<!-- 过滤器的名字 -->
	<filter-name>my</filter-name>
	<!-- 过滤器所对应的url -->
	<filter-class>filter.MyFilter</filter-class>
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
	<filter-name>my</filter-name>
	<url-pattern>/Login</url-pattern>
</filter-mapping>

如果设置两个Filter,按照在web.xml中的顺序调用,比如在上述代码中,先调用character,再调用my。

3.4 小结

  • 无参数构造函数
    只调用一次,当Tomcat启动时调用(Filter一定要进行配置)
  • init方法
    只调用一次,当Filter的实例化对象创建完成之后调用
  • doFilter方法
    调用多次,访问Filter的业务逻辑都写在Filter中
  • destory方法
    只调用一次,Tomcat关闭时调用
  • 多个Filter的调用顺序
    同时配置多个Filter,Fliter的调用顺序是由web.xml中的配置顺序来决定的,卸载上面的配置先调用,因为web.xml是从上到下顺序读取的。

4. 过滤器使用场景

  • 统一处理中文乱码
  • 屏蔽敏感词
  • 控制资源的访问权限

4.1 案例(屏蔽敏感词)

WordFilter

@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		// 将敏感词换成"**"
		String name = servletRequest.getParameter("name");
		System.out.println(name+"1");
		name = name.replaceAll("敏感", "**");
		System.out.println(name+"2");
		filterChain.doFilter(servletRequest, servletResponse);
	}

test.jsp

<%@page import="bysj01.User"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<form action="test" method="post">
		<input type="text" name="name">
		<input type="submit" value="提交">
	</form>
</body>
</html>

结果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43820008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值