Java servlet 过滤器是 Java Web 应用程序的基本组件,因为过滤器允许程序员拦截请求并转换响应以用于各种目的。即使您不创建任何过滤器,servlet 容器(如 Tomcat)和 Web 框架(如 Spring)也会在后台使用过滤器。
在本教程中,您将找到详细的分步指南来为您的项目创建 Java servlet 过滤器。
基本上,创建过滤器有 3 个步骤:
- 编写实现Filter接口并覆盖过滤器生命周期方法的Java类。
- 指定过滤器的初始化参数(可选)。
- 指定过滤器映射到 Java servlet 或 URL 模式。
表中的内容:
1.创建过滤器类
2.指定Filter的初始化参数
3. 指定过滤器映射
4.如何在Eclipse IDE中创建servlet过滤器
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 开发功能齐全的网站的实践经验,我推荐这门课程。
参考:
过滤器的要点
过滤 Javadoc
最后
以上就是潇洒大山最近收集整理的关于如何创建 Java Servlet 过滤器的全部内容,更多相关如何创建内容请搜索靠谱客的其他文章。
发表评论 取消回复