filter过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。
在对应的包下,可以通过New——》filter来创建过滤器。
2.filter的用法一个简单filter的语法形式:
public class MyFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
}
public void init(FilterConfig config) throws ServletException {
}
}
filter和Servlet形式一样,都有生命周期,都是先进行init的初始化然后就是doFilter进行过滤,在doFilter()方法中,需要使用chain.doFilter进行放行,然后交给下一个过滤器或servlet处理。
3.filter的配置方法 (1)在web.xml中进行配置配置语法:
(2)使用注解配置过滤器名 过滤器类的位置 过滤器名 /过滤器处理的Servlet
使用注解配置就是在过滤器的类之前加入一句
@WebFilter("/过滤器处理的Serlet")
就可以完成配置,当这个过滤器要过滤所有的Servlet时,将/servlet换成 } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { chain.doFilter(req, resp);//交给下一个过滤器或servlet处理 } public void init(FilterConfig config) throws ServletException { } }
@WebFilter("
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
}
public void init(FilterConfig config) throws ServletException {
}
}
3.多重过滤器的使用方法
首先要在一个项目中使用多个过滤器,就要在web.xml文件或者使用注解对Servlet进行配置,值得注意的是,在配置中,过滤器的顺序是根据web.xml文件中的
Servlet源码:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1这里不用再设置编码和处理中文乱码问题,因为过滤器已经预设过了
// 2这里只需要处理核心业务
PrintWriter out = response.getWriter();
out.write("这里是Servlet的输出,Servlet工作中...模拟的是核心业务");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
第一个过滤器源码:
public class MyFilter01 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器也可以给出响应,但不是处理业务,它只是准备的需要
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 让客户端也可以看到过滤效果,相当于是把核心内容包装成了一个HTML页【HTML标签首】
out.write(""
+ "Filter and Servlet "
+ "");
out.write("这里是过滤器01工作中开始...模拟的是一号过滤器
");
// 但核心业务仍然得放行,交给相应的Servlet去处理,项目中,职责要清晰
chain.doFilter(request, response);
// 【HTML标签尾】
out.write("
这里是过滤器01工作中结束...
");
out.write("");
}
}
第二个过滤器源码:
public class MyFilter02 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器在这里做的工作,与之前对比,仅只是想在客户端,即浏览器中也可以看到它的存在
PrintWriter out = response.getWriter();
out.write("这里是过滤器02工作中开始...模拟的是二号过滤器
");
// 放行后,核心业务仍然走Servlet处理
chain.doFilter(request, response);
out.write("
这里是过滤器02工作中结束...
");
}
}
web.xml文件内容:
j2018001001_08_servletAndMultiFilters MyFilter01 filter.MyFilter01 MyFilter01 /MyServlet MyFilter02 filter.MyFilter02 MyFilter02 /MyServlet MyServlet servlet.MyServlet MyServlet /MyServlet index.jsp
运行结果:
同理我们也可以使用注解的方式进行配置:
首先我们将web.xml文件中的关于过滤器02的配置全部注释掉:
此时如果我们继续运行Servlet,那么过滤器02就不会工作:
现在我们在过滤器02中加入注解配置:
以上两种均可以。
现在再次运行那么过滤器02再次工作。



