实现servlet过滤器需要使该类实现Filter接口并设置拦截对象,同时还要重写Filter接口的三个方法,如下所示:
package com.wjh.Test;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/servlet01")//拦截servlet01的请求,当参数是“/*”时表示拦截所有的请求(包括到请求到servlet类、jsp、html...)
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter01的生命周期开始...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter01对该请求进行了拦截...");
filterChain.doFilter(servletRequest,servletResponse);//放行被拦截的资源,如果不放行的话,请求就无法到达相应的文件
}
@Override
public void destroy() {//释放该类的资源
System.out.println("Filter01的生命周期结束...");
}
}
package com.wjh.Test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet01")
public class servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达了servlet01...");
}
}
package com.wjh.Test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet02")
public class servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求到达了servlet02...");
}
}
运行结果:
访问servlet01:
访问servlet02:
可以看见,过滤器只是拦截了被设置好的servlet01
如过设置了多个过滤器,那么过滤器的名字的首字母小的先执行,而响应却刚好反过来。