文章目录
六、过滤器
(一)Filter基础
1.Filter简介
Filter是Servlet规范的三大组件之一。可以在请求到达目标资源之前先对请求进行拦截过滤,也可以在响应到达客户端之前先对响应进行拦截过滤
2.Filter的生命周期
Filter的生命周期阶段有四个
(1)Filter对象的创建
(2)Filter对象的初始化
(3)Filter执行doFilter()方法
(4)Filter对象被销毁
Filter整个生命周期过程的执行,均由Web服务器负责管理
3.Filter接口
在Servlet规范中,有一个Filter接口,实现了该接口的类称为过滤器
该接口中有三个方法
init(),doFilter(),destroy()
package Filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter
{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException
{
System.out.println("执行了doFilter方法");
//将请求放行到下一个资源
chain.doFilter(request, response);
}
}
注册filter
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 注册filter -->
<filter>
<filter-name>this</filter-name>
<filter-class>Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>this</filter-name>
<!-- 对所有请求进行过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
4.Filter的特征
(1)Filter是在应用启动时被创建和初始化的
(2)Filter是单例多线程的,刷新网页时不会重新创建,只有一个
(3)Filter在应用被停止时销毁的
(4)doFilter()方法:无论哪个线程访问,只要由该Filter进行过滤,就会执行该Filter的doFilter()方法,并且每过滤一次就执行一次
(5)由于Filter是单例多线程的,为了保证其线程安全,一般不为Filter添加可修改的成员变量
5.FilterConfig
package Filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//本例演示FilterConfig的基本用法
//FilterConfig中保存了Filter在web.xml中的注册信息
public class MyFilter implements Filter
{
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException
{
//获取Filter的name
String filterName = filterConfig.getFilterName();
System.out.println("filterName = " + filterName);
//获取所有的初始化参数
Enumeration<String> names = filterConfig.getInitParameterNames();
while(names.hasMoreElements())
{
String name = names.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name + " = " + value);
}
//将请求放行到下一个资源
chain.doFilter(request, response);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 注册filter -->
<filter>
<filter-name>this</filter-name>
<filter-class>Filter.MyFilter</filter-class>
<!-- 添加初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>100</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>this</filter-name>
<!-- 对所有请求进行过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
6.Filter的url-pattern
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 注册filter -->
<filter>
<filter-name>this</filter-name>
<filter-class>Filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>this</filter-name>
<!-- 对所有请求进行过滤 -->
<!-- 若Filter为全路径匹配,则url-pattern只能写为/*而不能写为/ -->
<!-- <url-pattern>/*</url-pattern> -->
<!-- filter-mapping中可以不使用url-pattern,但需要指定servlet-name,即当前过滤器拦截的是对指定servlet的请求 -->
<servlet-name>this</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>this</servlet-name>
<servlet-class>Servlet.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>this</servlet-name>
<!--
/*:表示当前Servlet可以匹配所有的请求,即可以拦截所有的请求(动态/静态)
/:不会拦截动态资源请求,即不会拦截对于jsp页面的请求,但会拦截静态资源
-->
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
7.Filter实现的功能:
(1)快速解决Post和Get的中文乱码问题
(2)某些页面必须用户登录后才能访问,可以利用filter实现过滤