- 过滤
- 过滤器的用法
- 过滤器的优势
- API过滤器
- 筛选接口
- FilterChain接口
- FilterConfig接口
- 过滤器的简单示例
它主要用于执行过滤任务, 例如转换, 日志记录, 压缩, 加密和解密, 输入验证等。
【Servlet过滤器基本介绍和用法】Servlet过滤器是可插入的, 即在web.xml文件中定义了它的条目, 如果我们从web.xml文件中删除了filter的条目, 则过滤器将被自动删除, 我们不需要更改servlet。
因此维护成本会更少。
文章图片
注意:与Servlet不同, 一个过滤器不依赖于另一个过滤器。 过滤器的用法
- 记录所有传入的请求
- 记录发出请求的计算机的IP地址
- 转换
- 资料压缩
- 加密和解密
- 输入验证等
- 过滤器可插拔。
- 一个过滤器不依赖于另一种资源。
- 减少维护
像servlet过滤器一样有自己的API。 javax.servlet包包含Filter API的三个接口。
- 过滤
- 过滤链
- FilterConfig
要创建任何过滤器, 必须实现Filter接口。筛选器接口提供了筛选器的生命周期方法。
方法 | 描述 |
---|---|
public void init(FilterConfig config) | init()方法仅被调用一次。用于初始化过滤器。 |
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) | 每当用户请求过滤器映射到的任何资源时, 都会调用doFilter()方法, 该方法用于执行过滤任务。 |
public void destroy() | 当从服务中删除过滤器时, 仅调用一次。 |
FilterChain对象负责调用链中的下一个过滤器或资源。此对象在Filter接口的doFilter方法中传递.FilterChain接口仅包含一个方法:
- public void doFilter(HttpServletRequest request, HttpServletResponse response):它将控件传递给下一个过滤器或资源。
我们可以定义与servlet相同的过滤器。让我们看一下filter和filter-mapping的元素。
<
web-app>
<
filter>
<
filter-name>
...<
/filter-name>
<
filter-class>
...<
/filter-class>
<
/filter>
<
filter-mapping>
<
filter-name>
...<
/filter-name>
<
url-pattern>
...<
/url-pattern>
<
/filter-mapping>
<
/web-app>
对于映射过滤器, 我们可以使用url-pattern或servlet-name。 url-pattern元素优于servlet-name元素, 即可以应用于servlet, JSP或HTML。
过滤器的简单示例
在此示例中, 我们仅显示在请求的后处理之后自动调用过滤器的信息。
index.html
<
a href="http://www.srcmini.com/servlet1">
click here<
/a>
MyFilter.java
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() {}
}
HelloServlet.java
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("<
br>
welcome to servlet<
br>
");
}}
web.xml
为了定义过滤器, 必须像servlet一样定义web-app的filter元素。 |
<
web-app>
<
servlet>
<
servlet-name>
s1<
/servlet-name>
<
servlet-class>
HelloServlet<
/servlet-class>
<
/servlet>
<
servlet-mapping>
<
servlet-name>
s1<
/servlet-name>
<
url-pattern>
/servlet1<
/url-pattern>
<
/servlet-mapping>
<
filter>
<
filter-name>
f1<
/filter-name>
<
filter-class>
MyFilter<
/filter-class>
<
/filter>
<
filter-mapping>
<
filter-name>
f1<
/filter-name>
<
url-pattern>
/servlet1<
/url-pattern>
<
/filter-mapping>
<
/web-app>
下载此示例(使用Myeclipse IDE开发)
下载此示例(使用Eclipse IDE开发)
下载此示例(使用Netbeans IDE开发)
推荐阅读
- 带有注解的Servlet(Servlet3的功能)
- Servlet中的RequestDispatcher示例图解
- 服务器端包含(SSI)介绍
- Servlet中的SendRedirect用法示例
- Servlet中的分页示例图解
- Servlet使用JavaMail API发送电子邮件示例
- AndroidSDK的默认安装路径
- springboot[2.3.4.RELEASE]application.properties常用配置
- SpringApplication.run(xxx.class, args)背后的东东——整体脉络