如何创建 Java Servlet 过滤器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值