008_过滤器

本文详细介绍了Java Web中的过滤器(Filter)概念,包括其在客户端请求处理流程中的拦截作用,以及过滤器的生命周期、初始化、销毁方法。通过实例展示了如何创建并配置过滤器,以及过滤器的执行顺序。同时,提到了dispatcher属性的设置,如REQUEST、FORWARD、ERROR和INCLUDE等不同场景下的过滤行为。此外,还探讨了多个过滤器的执行顺序,并给出了过滤器链的示例。
摘要由CSDN通过智能技术生成

一. 过滤器

1. 过滤器其实就是对客户端(浏览器)发出来的请求进行过滤。客户端(浏览器)发出请求, 然后服务器派servlet处理, 在中间可以添加过滤器, 其实过滤器起到的是拦截的作用。

2. 过滤器作用

2.1. 对一些敏感词汇进行过滤

2.2. 统一设置编码

2.3. 自动登录

3. 过滤器的生命周期例子

3.1. 新建一个名叫FilterLifeCycle的Web项目

3.2. 定义过滤器, 需要实现Servlet的Filter接口

package com.lywgames.filterlifecycle;

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;

/**
 * 自定义过滤器需要实现Servlet的Filter接口
 */
public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("在服务器加载项目的时候创建, 初始化。");
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		System.out.println("进入到过滤器了, 可以进行过滤操作了。");
		// 本过滤器放行, 你可以去下一个过滤器或者Servlet了
		chain.doFilter(req, res);
	}
	@Override
	public void destroy() {
		System.out.println("服务器停止或者移除项目的时候的销毁。");
	}
}

3.3. 新建一个index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>过滤器生命周期</title>
	</head>
	<body>
		<h1>过滤器生命周期</h1>
	</body>
</html>

3.4. 在web.xml里注册过滤器和过滤器映射

3.5. 过滤器放行, 请求才能到达下一个过滤器、Servlet或者资源文件。过滤器放行方法是在doFilter方法里调用chain.doFilter进行放行。

3.6. 运行项目, 过滤器被初始化了, 也进入了过滤器操作方法, 如果我们在过滤器操作方法中放行的话, 才会进入主页; 如果不方行, 不会到达主页

3.7. 正常关闭服务器, 销毁了过滤器

4. 过滤器的生命周期

4.1. 在服务器加载项目的时候创建, 初始化。

4.2. 服务器停止或者移除项目的时候的销毁。

5. 过滤器的执行顺序

5.1. 单个过滤器的执行顺序: 客户端(浏览器)发出请求, 经过过滤器, 如果过滤器放行, 才能到达Servlet或者资源文件。

5.2. 多个过滤器的执行顺序: 如果有多个过滤器, 那么他们会按照过滤器注册的映射顺序来排队。请求经过一系列过滤器, 到达Servlet或者资源文件。

6. 过滤器的init方法的参数FilterConfig, 可以用于获取filter在注册的时候的名字以及初始化参数。

7. dispatcher设置

7.1. REQUEST: 只要是请求过来, 都拦截, 默认就是REQUEST。

7.2. FORWARD: 只要是转发都拦截。

7.3. ERROR: 页面出错发生跳转。 

7.4. INCLUDE: 包含页面的时候就拦截。

8. 过滤器链例子

8.1. 新建一个名叫FilterLifeCycle的Web项目

8.2. 新建一个MyFilter1.java

package com.lywgames.filterlifecycle;

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 MyFilter1 implements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException {
		String filterName = config.getFilterName();
		String param1 = config.getInitParameter("param1");
		
		System.out.println("filterName = " + filterName);
		System.out.println("param1 = " + param1);
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		System.out.println("请求进入到过滤器1");
		chain.doFilter(req, res);
		System.out.println("请求经过Servlet处理后, 返回到过滤器1");
	}
	@Override
	public void destroy() {
		System.out.println("销毁过滤器1");
	}
}

8.3. 新建一个MyFilter2.java

package com.lywgames.filterlifecycle;

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 MyFilter2 implements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException {}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		System.out.println("请求进入到过滤器2");
		chain.doFilter(req, res);
		System.out.println("请求经过Servlet处理后, 返回到过滤器2");
	}
	@Override
	public void destroy() {
		System.out.println("销毁过滤器2");
	}
}

8.4. 新建一个MyFilter3.java

package com.lywgames.filterlifecycle;

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 MyFilter3 implements Filter {
	@Override
	public void init(FilterConfig config) throws ServletException {}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		System.out.println("请求进入到过滤器3");
		chain.doFilter(req, res);
		System.out.println("请求经过Servlet处理后, 返回到过滤器3");
	}
	@Override
	public void destroy() {
		System.out.println("销毁过滤器3");
	}
}

8.5. 新建一个index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>主页面</title>
	</head>
	<body>
		<h1>主页面</h1>
	</body>
</html>

8.6. 在web.xml里注册过滤器和过滤器映射, 过滤器初始化参数

8.7. 运行项目

8.8. 关闭服务器, 销毁过滤器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值