什么是过滤器?
servlet规范当中定义的一种特殊的组件,用于拦截servlet容器的调用过程。
注:
容器收到请求之后,会先调用过滤器,再调用
servlet或者其它资源。
过滤器的优点
a.可以在不修改源代码的基础上,为应用添加新的功能。
b.可以将多个组件相同的功能集中写在过滤器里面,方便代码的维护。
如何写一个过滤器
step1.写一个java类,实现Filter接口。
step2.在doFilter方法里面,实现拦截处理逻辑。
step3.配置过滤器。(web.xml)
<filter>
<filter-name>commentFilter2</filter-name>
<filter-class>web.CommentFilter2</filter-class>
<init-param>
<param-name>size</param-name>
<param-value>5</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>commentFilter2</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
<filter>
<filter-name>commentFilter</filter-name>
<filter-class>web.CommentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>commentFilter</filter-name>
<url-pattern>/comment</url-pattern>
</filter-mapping>
容器启动后会检查配置文件,把里面所以有的过滤器先实例化,将实例化后的对象放到FilterChain对象中(过滤器链),顺序按照优先级存放(配置文件的先后顺序),
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "CommentFilter",urlPatterns = "/comment")
public class CommentFilter implements Filter {
/**
* 容器启动之后,会立即创建过滤器实例。
* 注:
* 只会创建一个实例!
*/
public CommentFilter() {
System.out.println("------------CommentFilter()-------------------");
}
/**
* 容器在创建好过滤器实例之后,会立即
* 调用该实例的init方法。
* 注:
* 该方法只会调用一次!
*/
public void init(FilterConfig config) throws ServletException {
System.out.println("-----------CommentFilter----init()-----------------------");
}
/**
* 容器在调用完过滤器的init方法之后,
* 会调用doFilter方法来处理请求。
* 注:(了解)
* ServletRequest是HttpServletRequest
* 的父接口,ServletResponse是
* HttpServletResponse的父接口。
*
* FilterChain(过滤器链):
* 如果调用了该对象的doFilter方法,
* 表示继续向后调用;否则,中断请求,返回
* 处理结果。
*
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("------------commentFileter's doFilter()---------------");
chain.doFilter(request, response);
}
public void destroy() {
}
}
控制台输出: