一. 过滤器
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. 关闭服务器, 销毁过滤器