1. Filter概念
Filter也称之为过滤器,WEB开发人员通过Filter技术可以对web服务器管理的所有web资源:Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能
2. Filter简介
Filter也是一个Java类,添加方式和普通的Java类完全相同。自定义的Filter类必须实现Filter接口,实现Filter接口中定义的方法:
1. init() :初始化时会自动调用
2. doFilter():request和response经过经过时调用
3. destroy():销毁时调用
4. doFilter()方法接受三个参数,分别是request、response和chain。其中request和response用来传递给下一个Filter(如果有多个Filter)或者JSP和Servlet。chain则通过调用其doFilter方法来调用下一个Filter,获得调用原始的JSP或者Servlet等其他内容。
3. Filter生命周期
Init方法
1. 服务器创建一个Filter对象时会自动调用对象的init方法
2. 通过init(FilterConfig filterConfig)方法可以获得Filter的初始化参数
destroy方法
1. 在Web容器卸载 Filter 对象之前被调用,该方法主要用于释放Filter
2. 占用的资源
4. Filter使用方法
package demo.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFilter implements Filter{
@Override
public void destroy() {
System.out.println("过滤器被销毁");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//向上转型
HttpServletRequest request1 = (HttpServletRequest) request;
HttpServletResponse response1=(HttpServletResponse) response;
System.out.println("过滤器被执行");
//放行,如果不放行,程序将不会往下执行
chain.doFilter(request1, response1);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器被初始化");
}
}
新建一个类,实现Filter接口,在doFilter方法中编写过滤代码,注意Filter的包是javax.servlet.Filter,不要引错。
过滤器配置
过滤器一定要放行,否则程序不会往下执行
配置web.xml文件如下
如果想要拦截所有目录下的文件,使用 /* 即可完成,每个网页发出请求后都会先经过过滤器,服务器发出响应也会先经过过滤器。
当在浏览器中输入项目下的文件路径时,控制台会输出过滤器被执行
5. 全站字符编码
由于每个虚拟的java页面都要单独设置请求与响应编码很麻烦,而且不利于管理,这时我们可以选择使用过滤器,完成字符编码。
我的过滤器doFilter.java文件如下
package demo.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharSetFilter implements Filter {
@Override
public void destroy() {
System.out.println("过滤器被销毁");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
/**
* 请求使用POST
* 保证响应时原始数据正常
* 文件原始编码与设置的编码都一致
*/
HttpServletResponse response2 = (HttpServletResponse) response;
HttpServletRequest request2 = (HttpServletRequest) request;
//设置编码
request2.setCharacterEncoding("UTF-8");
response2.setCharacterEncoding("UTF-8");
response2.setContentType("text/html;charset=UTF-8");
System.out.println("字符编码过滤器被执行");
//放行
chain.doFilter(request2, response2);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器被初始化");
}
}
web.xml文件配置如下
JSP文件内容如下
访问该jsp文件