一.什么是Filter
filter,中文名为过滤器。是用来过滤的。通过它可以改变请求和响应信息。Filter并不能产生响应信息,而只能在一个请求到达之前预处理该请求,也可以在请求离开之前处理响应。
借助于过滤器可以实现以下功能:
1.过滤非法文字和信息
2.设置统一字符编码
3.对用户进行登录验证
4.改变图片文件格式
5.对相应内容做压缩处理
6.对XML的输出使用XSLT来进行转换
二.实现一个过滤器
Filter也是一个Java类。自定义的Filter类必须实现Filter接口,还必须实现Filter接口中定义的init()方法,doFilter()方法,destroy()方法。
方法名 | 描述 |
---|---|
init() | 用于初始化 |
doFilter() | 用来实现过滤,所有的处理代码都放在该方法中 |
destroy() | 用来销毁 |
doFilter方法的参数解释:
参数名 | 描述 |
---|---|
request | 用来传递给下一个Filter或者JSP和Servlet |
response | 用来传递给下一个Filter或者JSP和Servlet |
chain | 通过调用其doFilter方法来调用下一个Filter,获得调用原始的JSP或者Servlet等其他内容 |
范例: 演示如何定义一个Filter,并过滤整个web项目
package com.javaweb.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 HelloFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
//初始化代码
}
public void destroy() {
// TODO Auto-generated method stub
//销毁代码
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//过滤代码
System.out.println("执行过滤");//过滤处理代码
chain.doFilter(request, response);//调用下一个Filter或者其他原始内容
}
}
如果要是该Filter起作用,还必须在web.xml文件中配置该Filter,代码如下:
<!-- 定义Filter本身 -->
<filter>
<!-- 指定Filter的名称 -->
<filter-name>HelloFilter</filter-name>
<filter-class>com.javaweb.Filter.HelloFilter</filter-class>
</filter>
<!-- 定义Filter映射信息 -->
<filter-mapping>
<!-- 指定Filter的名称 -->
<filter-name>HelloFilter</filter-name>
<!-- 指令过滤URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
filter的配置和servlet很相似,只要将servlet换成filter就可以了。
在浏览器输入http://localhost:8080/JavaWeb05/*,在后台console会看到如下图:
三.Filter生命周期
Filter的生命周期和Servlet很相似。过程如下:
1.服务器启动时就加载Filter
2.加载完成后立即调用init()方法进行初始化操作
3.过滤用户请求,调用doFilter()方法
4.调用destroy()方法
5.通过垃圾收集器进行收集清理
Filter的生命周期与Servlet的生命周期的区别:
第一点和第三点不同。
第一点区别:Filter是在服务器启动时就加载并完成初始化,Servlet是用户执行该Servlet时才会进行加载并初始化。
第三点区别:Filter可以根据配置文件来过滤多个用户请求URL,Servlet只能处理一个指定的URL。
总结:不管是Filter还是Servlet,在加载和初始化完成后,再次调用时不需要再进行初始化。只有重新加载项目或者重启服务器后才需要重新初始化。
四.IP地址过滤器
当一个用户发出访问请求时,首先通过过滤器进行判断,如果用户的IP地址被限制,则禁止访问,否则为合法IP,可以继续访问。
范例: 定义一个IP过滤器,它能够获得用户的IP地址,并对用户的IP进行判断。如果用户的IP被限制,则无法访问整个web项目。
IPFilter.java
package com.javaweb.Filter;
import java.io.IOException;
import java.io.PrintWriter;
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 IPFilter implements Filter{
protected FilterConfig filterConfig;//包含了过滤器的配置信息
protected String ip;//ip属性存放被限制的恶ip信息
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;//设置属性filterConfig
this.ip = this.filterConfig.getInitParameter("ip");//获得初始化参数ip
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
String remoteIP = request.getRemoteAddr();//获得客户IP
if(remoteIP.equals("ip")){//判断IP是否被禁止
response.setContentType("text/html; charset = UTF-8");//设置Content-t字段值
response.setCharacterEncoding("gb2312");//设置输出内容编码格式
PrintWriter out = response.getWriter();//获得输出流
out.println("<b>该IP地址被禁止访问,请联系管理员!</b>");//输出不能访问的信息
}else{
chain.doFilter(request, response);//向下传递
}
}
public void destroy() {
// TODO Auto-generated method stub
//销毁方法
}
}
在web.xml中配置该过滤器,跟前面不同的是多了一个初始化参数的配置,代码如下:
<!-- 定义Filter本身 -->
<filter>
<!-- 指定Filter的名称 -->
<filter-name>IPFilter</filter-name>
<filter-class>com.javaweb.Filter.IPFilter</filter-class>
<init-param>
<param-name>ip</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
</filter>
<!-- 定义Filter映射信息 -->
<filter-mapping>
<!-- 指定Filter的名称 -->
<filter-name>IPFilter</filter-name>
<!-- 指令过滤URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
打开浏览器,访问该项目下的任何一个servlet或者jsp,后台console会显示“该IP地址被禁止访问,请联系管理员”
摘自《Java Web 程序设计与项目实践》,电子工业出版社