Java Servlet Filter是Java Web应用程序中最重要的Web组件。它可以拦截HTTP Web通信中的请求和响应。它可以提取和操作客户端和Web服务器之间交换的数据。因此,可以编写代码来预处理请求并使用它对响应进行后处理。您可以在请求传递给被调用资源之前执行日志记录,身份验证,操作会话属性等操作。您还可以在响应数据发送回客户端之前执行编码,格式化等操作。
Java Servlet Filter的优势
-
使Web应用程序的常见任务变得简单:
例如,当要验证会话对象以确保用户已登录每个jsp页面或servlet调用时。您可以在每个被调用的Web资源中调用用户身份验证代码。但是维护并不容易。如果添加新的servlet或jsp页面。您还必须向它们添加身份验证代码。使用 java servlet 过滤器,您可以轻松解决问题。您只需要在过滤器的 doFilter()方法中编写用户身份验证代码。并在web.xml中配置此java servlet过滤器应用于哪些Web资源。然后,首先处理对此java servlet过滤器类过滤的资源的所有请求。如果添加新的Web资源,则只需要在web.xml中添加xml配置,不需要更改源代码。 -
Java Servlet Filter是可插入的:
您可以创建多个java servlet过滤器并将它们应用于不同的资源。每个人都可以拥有自己的目的,例如记录请求数据,身份验证,更改请求字符集,压缩响应数据以及向http响应添加cookie或标头。您还可以配置java servlet过滤器顺序,以便处理请求他们所有人一个接一个。这也称为java servlet过滤器链。 -
动态:
Java Servlet过滤器在Web容器启动时加载。当请求进入时,容器将在运行时调用它。并自动拦截请求和响应。 -
声明性:
Java Servlet Filter在web.xml(java Web应用程序描述符)中声明。如果要配置新的,只需要在web.xml中声明它,不需要更改java和jsp页面代码。 -
模块化:
因为每个Filter通常用于封装一个通用的逻辑功能。因此,一个过滤器类只是一个模块化功能单元。您可以轻松地向Web应用程序资源添加或删除任何过滤器(模块化功能)。 -
Portable:
基于java,因此它可以在java平台和web容器中移植。
可重用: 因为它是可移植的并以声明方式配置,因此很容易在不同的Web应用程序中重用。 -
透明:
因为它处理客户端和服务器之间的请求或响应,而不会对Web资源提供的核心处理产生任何影响。因此,对于目标资源,Filter是透明的,可以在必要时添加或删除到资源。但它不会打破网络资源。 -
结论:
简而言之,Java Servlet Filter是通过web.xml灵活声明的模块化,可移植和可重用的Web组件。它可以透明地动态预处理请求或后处理响应。
Servlet过滤器实现
javax.servlet.Filter接口用于创建过滤器类。它包含Filter的所有生命周期方法。它由Web容器管理。
- void init(FilterConfig fConfig) :当容器加载并初始化Filter类时调用此方法。它只在它的生命周期中被调用一次。您应该初始化资源,例如获取数据库连接,打开文件处理程序。
FilterConfig输入参数用于从Web应用程序配置文件(web.xml)获取此Filter的init参数。它还可以返回ServletContext对象以获取容器相关信息。 - doFilter(ServletRequest请求,ServletResponse响应,FilterChain链): 每次web容器调用此类时,都会执行此方法中的java代码。您可以使用Web容器提供的请求和响应对象来提取和操作请求或响应数据。您可以调用过滤器链中的下一个过滤器,或者使用FilterChain 对象将请求数据传递给目标资源 。
- void destroy(): 当容器删除Filter对象时调用此方法。您应该关闭在init()mehtod中打开的所有资源(例如数据库连接,文件处理程序)。此方法仅调用一次。
在配置文件中配置过滤器
有两种方法可以配置Filter对象。
- 在web.xml中声明:
<!-- This is declaration. -->
<filter>
<display-name>Authenticate login credential.</display-name>
<!-- This is the name. -->
<filter-name>LoginAuthFilter</filter-name>
<!-- This is the implementation class. -->
<filter-class>com.dev2qa.example.servlet.filter.LoginAuthFilter</filter-class>
</filter>
<!-- When request url match the url-pattern, the mapping filter will be invoked. -->
<filter-mapping>
<!-- This is just the filter name decalred above. -->
<filter-name>LoginAuthFilter</filter-name>
<!-- This is the request url such as http://localhost:8080/Dev2qaWebAppExample/HelloWorld -->
<url-pattern>/HelloWorld</url-pattern>
</filter-mapping>
- 使用WebFilter Annotation
在Servlet 3.0中,可以使用javax.servlet.annotation.WebFilter来声明它。这个注释还有其他参数,可以定义它的名称,init参数,url模式等。但是如果你经常更改配置,最好使用web.xml。因为它不需要重新编译java类。