猿教程 Logo

Servlet过滤器

过滤器是在请求的预处理和后处理时调用的对象。

它主要用于执行过滤任务,如转换,日志记录,压缩,加密和解密,输入验证等。

servlet过滤器是可插入的,即其条目在web.xml文件中定义,如果我们从web.xml文件中删除过滤器条目,过滤器将被自动删除,我们不需要更改servlet。

因此维护成本会更低。


注意:与Servlet不同,一个过滤器不依赖于另一个过滤器。


过滤器的使用

  • 记录所有传入的请求
  • 记录请求源自的计算机的IP地址
  • 转换
  • 数据压缩
  • 加密和解密
  • 输入验证等。

过滤器的优点

  1. 过滤器是可插拔的。
  2. 一个过滤器对另一个资源没有依赖性。
  3. 减少维护

过滤器API

servlet过滤器有自己的API。 javax.servlet包包含Filter API的三个接口。

  1. Filter

  2. FilterChain

  3. FilterConfig


1)过滤器接口

要创建任何过滤器,您必须实现过滤器接口。 过滤器接口为过滤器提供了生命周期方法。

方法描述
public void init(FilterConfig config)init()方法只被调用一次。 它用于初始化过滤器。
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)doFilter()方法在每次用户请求任何资源时被调用,过滤器映射到该资源。它用于执行过滤任务。
public void destroy()当过滤器从服务中取出时,仅调用一次。

2)FilterChain接口

FilterChain的对象负责调用链中的下一个过滤器或资源。此对象在Filter接口的doFilter方法中传递。FilterChain接口只包含一个方法:

  1. 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模式元素具有优于servlet名称元素的优点,即它可以应用于servlet,JSP或HTML。


过滤器的简单示例

在此示例中,我们只显示在请求的后处理之后自动调用过滤器的信息。


index.html

<a href="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应用的过滤器元素必须像servlet一样被定义。

<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>


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Servlet/servlet-filter.html