📅  最后修改于: 2021-01-09 12:46:55             🧑  作者: Mango
过滤器是在请求的预处理和后处理中调用的对象。
它主要用于执行过滤任务,例如转换,日志记录,压缩,加密和解密,输入验证等。
servlet过滤器是可插入的,即它的入口在web.xml文件中定义,如果我们从web.xml文件中删除过滤器的入口,过滤器将被自动删除,我们不需要更改servlet。
因此维护成本将更少。
注意:与Servlet不同,一个过滤器不依赖于另一个过滤器。
像servlet过滤器一样有自己的API。 javax.servlet包包含Filter API的三个接口。
要创建任何过滤器,必须实现Filter接口。过滤器接口提供了过滤器的生命周期方法。
Method | Description |
---|---|
public void init(FilterConfig config) | init() method is invoked only once. It is used to initialize the filter. |
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) | doFilter() method is invoked every time when user request to any resource, to which the filter is mapped.It is used to perform filtering tasks. |
public void destroy() | This is invoked only once when filter is taken out of the service. |
FilterChain对象负责调用链中的下一个过滤器或资源。此对象在Filter接口的doFilter方法中传递。FilterChain接口仅包含一个方法:
我们可以定义与servlet相同的过滤器。让我们看一下filter和filter-mapping的元素。
...
...
...
...
对于映射过滤器,我们可以使用url-pattern或servlet-name。 url-pattern元素比servlet-name元素具有优势,即可以应用于servlet,JSP或HTML。
在此示例中,我们仅显示在请求的后处理之后自动调用过滤器的信息。
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
public class MyFilter implements Filter{
public void init(FilterConfig arg0) throws ServletException {}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
PrintWriter out=resp.getWriter();
out.print("filter is invoked before");
chain.doFilter(req, resp);//sends request to next resource
out.print("filter is invoked after");
}
public void destroy() {}
}
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.print("
welcome to servlet
");
}
}
为了定义过滤器,必须像servlet一样定义web-app的filter元素。
s1
HelloServlet
s1
/servlet1
f1
MyFilter
f1
/servlet1