Java servlet 过滤器是 Java Web 应用程序的基本组件,因为过滤器允许程序员拦截请求并转换响应以用于各种目的。即使您不创建任何过滤器,servlet 容器(如 Tomcat)和 Web 框架(如 Spring)也会在后台使用过滤器。
在本教程中,您将找到详细的分步指南来为您的项目创建 Java servlet 过滤器。
基本上,创建过滤器有 3 个步骤:
- 编写实现Filter接口并覆盖过滤器生命周期方法的Java类。
- 指定过滤器的初始化参数(可选)。
- 指定过滤器映射到 Java servlet 或 URL 模式。
表中的内容:
5. 如何在 NetBeans IDE 中创建 servlet 过滤器
让我们详细了解每个步骤。
1.创建过滤器类
通常,过滤器类具有如下结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package net.codejava;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// invoked when an instance of this filter is created by the container
// used to initialize resources, read parameters...
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// invoked when a matching request sent to the server
// used to intercept the request and transform the response
chain.doFilter(request, response); // invokes next filter in the chain
}
@Override
public void destroy() {
// invoked when the filter instance is being destroyed by the container
// used clean up resources
}
}
|
如您所见,该类必须实现Filter接口并覆盖其三个生命周期方法:init()、doFilter()和destroy()。评论中清楚地解释了每种方法的目的。阅读本文以了解有关注解类型@WebFilter的更多信息。
注意:从 Java Servlet API 4.0 开始,您只能覆盖doFilter()方法,因为Filter接口将init()和destroy()实现为默认方法。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package net.codejava;
import java.io.IOException;
import javax.servlet.*;
public class HelloFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// invoked when a matching request sent to the server
// used to intercept the request and transform the response
chain.doFilter(request, response); // invokes next filter in the chain
}
}
|
2.指定Filter的初始化参数
您可以在 Web 部署描述符文件 ( web.xml )中为过滤器指定初始化参数,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
< filter >
< filter-name >Hello Filter</ filter-name >
< filter-class >net.codejava.HelloFilter</ filter-class >
< init-param >
< param-name >message</ param-name >
< param-value >A message from Hello Filter</ param-value >
</ init-param >
< init-param >
< param-name >threshold</ param-name >
< param-value >1024</ param-value >
</ init-param >
</ filter >
|
如您所见,您必须指定过滤器名称及其完全限定的类名:
1
2
|
< filter-name >Hello Filter</ filter-name >
< filter-class >net.codejava.HelloFilter</ filter-class >
|
每个参数声明如下:
1
2
3
4
|
< init-param >
< param-name >threshold</ param-name >
< param-value >1024</ param-value >
</ init-param >
|
您可以根据需要指定任意数量的参数。然后在过滤器的init()方法中,您可以通过FilterConfig对象读取这些初始化参数,如下所示:
1
2
3
4
5
6
|
public void init(FilterConfig fConfig) throws ServletException {
String message = fConfig.getInitParameter( "message" );
String threshold = fConfig.getInitParameter( "threshold" );
// do something with the parameters
}
|
注意:您可以在过滤器类中使用注释来指定初始化参数,但不建议这样做,因为当您想要更改参数的值时需要重新编译代码。
3. 指定过滤器映射
过滤器的目的是拦截请求,因此您必须通过映射步骤指定过滤器将处理哪些 URL。您可以使用 XML 或注释将过滤器映射到任何 URL 模式。
通过 XML 指定过滤器映射
您可以像这样将过滤器映射到 servlet:
1
2
3
4
|
< filter-mapping >
< filter-name >Hello Filter</ filter-name >
< servlet-name >Hello Servlet</ servlet-name >
</ filter-mapping >
|
servlet 在web.xml文件中声明和映射如下:
1
2
3
4
5
6
7
8
9
|
< servlet >
< servlet-name >Hello Servlet</ servlet-name >
< servlet-class >net.codejava.HelloServlet</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >Hello Servlet</ servlet-name >
< url-pattern >/hello</ url-pattern >
</ servlet-mapping >
|
如果 servlet 类使用@WebServlet注解进行注解,则必须像这样指定 servlet 的名称:
1
2
3
4
|
@WebServlet (name = "Hello Servlet" , urlPatterns = { "/hello" })
public class HelloServlet extends HttpServlet {
}
|
您可以将过滤器映射到 URL 模式,如下所示:
1
2
3
4
|
< filter-mapping >
< filter-name >Hello Filter</ filter-name >
< url-pattern >/*</ url-pattern >
</ filter-mapping >
|
在这里,过滤器Hello Filter映射到 URL 模式/*,这意味着它将拦截所有请求。
以下示例说明了如何将过滤器映射到多个 URL 模式:
1
2
3
4
5
6
|
< filter-mapping >
< filter-name >Hello Filter</ filter-name >
< url-pattern >/hello</ url-pattern >
< url-pattern >/bonjour</ url-pattern >
< url-pattern >/ciao</ url-pattern >
</ filter-mapping >
|
使用注释指定过滤器映射
从 Servlet API 3.0 开始,您可以使用@WebFilter来注释一个过滤器类。例如:
1
2
3
4
5
6
7
|
import javax.servlet.annotation.WebFilter;
// other imports
@WebFilter ( "/hello" )
public class HelloFilter implements Filter {
// implement life cycle methods…
}
|
您可以看到这个过滤器类被映射到 URL 模式/hello - 这比使用 XML 更方便,对吧?
以下示例显示如何将过滤器映射到多个 URL 模式:
1
2
3
4
|
@WebFilter ({ "/servlet1" , "/servlet2" , "/servlet3" })
public class FilterA implements Filter {
}
|
这个例子说明了如何使用注解将过滤器映射到 servlet:
1
2
3
4
|
@WebFilter (servletNames = { "Hello Servlet" })
public class HelloFilter implements Filter {
}
|
请注意,您可以将一个过滤器映射到一个或多个 servlet/URL 模式,并将多个过滤器映射到一个 servlet/URL 模式。
4.如何在Eclipse IDE中创建servlet过滤器
使用 Eclipse IDE 开发 Java Web 应用程序时,您可以通过向导轻松创建过滤器。要在 Eclipse 中创建过滤器类,请单击菜单File > New,然后选择Web组下的Filter :
或者您可以右键单击一个包,然后单击New > Filter:
然后指定过滤器的类名:
单击下一步。然后指定过滤器映射:
您可以指定 URL 模式映射:
或指定 servlet 映射:
单击Finish,Eclipse 将为带有@WebFilter注释的过滤器类生成基本代码。
5. 如何在 NetBeans IDE 中创建 servlet 过滤器
NetBeans IDE 还可以轻松创建过滤器。单击菜单File > New File...并在Web组中选择Filter :
单击Next,并指定过滤器的类名:
单击下一步配置过滤器部署:
您可以通过选中“将信息添加到部署描述符 (web.xml) ”选项来选择使用 XML 映射进行过滤。并编辑过滤器映射:
最后,指定过滤器的初始化参数:
单击完成,NetBeans 将根据您提供的信息为过滤器生成代码。
这几乎是创建 Java 过滤器需要了解的内容。我建议您阅读这本著名的 Servlet 和 JSP书籍,以全面了解 Java servlet 和 JSP。如果您想获得使用 Java 开发功能齐全的网站的实践经验,我推荐这门课程。