FIlter:可以拦截请求和响应;实践中的使用:url访问权限控制、敏感词过滤、压缩响应信息。
Filter是一个接口,接口中的doFilter()方法是真正执行的方法;
Filter需要在web.xml中配置。
****使用步骤:类似servlet:
创建一个类继承接口,实现doFilter方法,web.xml中配置;
<filter>
<filter-name>testFilt</filter-name>
<filter-class>实现filter接口的类名(其中包名也要带上)</filt-class>
</filter>
<filter-mapping>
<filter-name>testFilt</filter-name>
<url-pattern>被拦截的路径(访问这个路径就被拦截) </url-attern>
<filter-mapping>
chain.dofilter(request,reponse);放行,向链中的下一个节点传递;
******FIlter生命周期:
*****FilterConfig作用:获取Filter的相关配置信息,和sercletConfig类似:初始化参数的获取,Filter名称的获取,servletContext对象的获取;
Filter的详细配置:可以有多个Filter,filter的执行顺序由web.xml中<filter-mapping>的顺序决定,在上面的先执行;所有filter执行完成,再执行servlet等web资源;
<url-pattern>的几种写法:
1.完全匹配:必须以/开始
2.*通配符:包括目录匹配:/a/*;扩展名匹配:*.do *.action 不能以/开始;
过滤器Filter是servlet规范中定义的一种特殊的类,用于对servlet容器的调用过程进行拦截。有多个过滤器时依照<filrter-mapping>的先后顺序执行。
写一个Java类,实现Filter接口;在doFilter的方法中实现过滤的逻辑。
在web.xml中实现:
<filter>
<filter-name>CommentFilter2</filter-name>
<filter-class>web.CommentFilter2</filter-class>
<init-param>
<param-name>size</param-name>
<param-value>3</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CommentFilter2</filter-name>
<url-pattern>/CommentFilter2</url-pattern>
</filter-mapping>
package web;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CommentFilter2 implements Filter {
private FilterConfig config;
public void destroy() { }
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
System.out.println("Filter2 begin process...");
HttpServletRequest request =
(HttpServletRequest)arg0;
HttpServletResponse response =
(HttpServletResponse)arg1;
String name = request.getParameter("name");//获取传过来的参数
response.setContentType("text/ html;charset=utf-8");
PrintWriter out = response.getWriter();
int size = Integer.parseInt(config.getInitParameter("size"));//获取初始化配置参数
System.out.println(size);
if(name.length() > size){
out.println("超过最大长度");
}else{
//调用后续的过滤器,如果没有了,则调用 web 组件
// arg2.doFilter(arg0, arg1);
request.getRequestDispatcher("add") .forward(request, response);
}
System.out.println("Filter2 process finished.");
}
public void init(FilterConfig arg0) throws ServletException {
config = arg0;
}
}