Servlet分3中:
- 简单Servlet
- 过滤器Servlet
- 监听器Servlet
过滤器的基本概念
Filter是在Servlet2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可使用过滤器完成。
过滤器是以一种组件的形式绑定到Web应用程序当中的,与其他的Web应用程序组件不同的是,过滤器是采用“链”的方式进行处理的,如图所示:
实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了3个操作方法,如表所示:
方法 | 描述 |
---|---|
public void init(FilterConfig fConfig) throws ServletException | 过滤器初始化(容器启动时初始化)时调用,可以通过FilterConfig取得配置的初始化参数 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException | 完成具体的过滤操作,然后通过FilterChain让请求继续向下传递 |
public void destroy() | 过滤器销毁时调用 |
从上面的表中可以发现,最重要的方法是doFilter方法,在此方法中定义了ServletRequest、ServletResponse、FilterChain三个参数,前两个参数可以完成对任意协议的过滤操作。FilterChain接口的主要作用是将用户的请求向下传递给其他的过滤器或者Servlet。
【SimpleFilter.java】定义一个简单的过滤器
package im.weitang.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 SimpleFilter implements Filter {
public void destroy() {
System.out.println("过滤器销毁");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行doFilter方法之前");
chain.doFilter(request, response);
System.out.println("执行doFilter方法之后");
}
public void init(FilterConfig fConfig) throws ServletException {
String initParam = fConfig.getInitParameter("ref");
System.out.println("过滤器初始化,初始化参数ref = " + initParam);
}
}
示例1:编码过滤
【EncodingFilter.java】
package im.weitang.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 EncodingFilter implements Filter {
private String charSet;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(this.charSet);
}
public void init(FilterConfig fConfig) throws ServletException {
this.charSet = fConfig.getInitParameter("charset");
}
}
修改web.xml,添加如下代码:
<filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>im.weitang.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/EncodingFilter</url-pattern>
</filter-mapping>
示例2:登录验证