一,实现过滤器
在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可完成。此接口定义了三个方法。
NO | 方法 | 描述 |
1 | public void init(FilterConfig filterConfig) throws ServletException | 过滤器初始化时调用,可以通过filterConfig取得配置的初始化参数 |
2 | public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException | 完成具体的过滤操作,然后通过FilterChain让请求继续向下传递 |
3 | public void destroy() | 过滤器销毁时使用 |
在三个方法中,最重要的是doFilter()方法,此方法定义了ServletRequest,ServletResponse和FilterChain三种参数,其中前两个参数表示,过滤器可以完成对任意协议的过滤操作。FilterChain接口的作用是将用户的请求向下传递给其他过滤器或Servlet执行操作。
FilterChain接口定义的方法
NO | 方法 | 描述 |
1 | public void doFilter(ServletRequest req,ServletResponse resp) throws IOException,ServletException` | 将用户请求向下传递给其他过滤器或Servlet |
在FilterChain接口中,定义了一个同样的doFileter()方法,因为在这一过滤器之后有可能还有其他过滤器,也可能是请求的最终目标Servlet。这样就通过FilterChain形成了一个“过滤链"。
public class FilterDemo implements Filter {
public void init(FilterConfig config) throws ServletException {
String initParam = config.getInitParameter("ref") ;
System.out.println("过滤器初始化,初始化参数:"+initParam) ;
}
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException{
System.out.println("执行doFilter()方法之前") ;
chain.doFilter(req,resp) ;
System.out.println("执行doFilter()方法之后") ;
}
public void destroy() {
System.out.println("过滤器销毁") ;
}
}
web-xml文件配置
<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>org.panda.filterdemo.FilterDemo</filter-class>
<init-param>
<param-name>ref</param-name>
<param-value>Hello World</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器的初始化方法是在容器启动时就加载的,并且通过FilterConfig的getInitParamter()方法取得了初始化参数。
二,过滤器的应用
1,编码过滤
为所有的页面设置统一的请求编码
public class EncodingFilter implements Filter {
private String charSet ; //设置字符编码
public void destroy() {
System.out.println("过滤器销毁") ;
}
public void init(FilterConfig config) throws ServletException {
this.charSet = config.getInitParameter("charset") ; //取得初始化参数
}
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException{
resp.setCharacterEncoding("this.charSet") ; //设置统一编码
}
}