Java Servlet过滤器示例教程

时间:2020-02-23 14:36:50  来源:igfitidea点击:

Java Servlet过滤器用于拦截客户端请求并进行一些预处理。
它也可以截取响应并进行后处理,然后再发送到Web应用程序中的客户端。
这是Web应用程序教程系列中的第四篇文章,您可能也想看看之前的文章。

  • Java Web应用程序
  • Java Servlet教程
  • Servlet会话管理

Servlet过滤器

在本文中,我们将学习Java中的Servlet过滤器。
我们将研究servlet过滤器的各种用法,如何创建过滤器并通过简单的Web应用程序学习其用法。

  • 为什么会有Servlet筛选器?

  • Servlet过滤器接口

  • Servlet WebFilter批注

  • web.xml中的Servlet过滤器配置

  • 用于日志记录和会话验证的Servlet筛选器示例

  • 为什么要使用Servlet筛选器?在上一篇文章中,我们学习了如何在Web应用程序中管理会话,并且如果要确保仅在用户会话有效时才可访问资源,则可以使用Servlet会话属性来实现此目的。

    这种方法很简单,但是如果我们有很多servlet和jsps,那么由于冗余代码,它将变得难以维护。
    如果将来要更改属性名称,则必须更改所有具有会话身份验证的位置。
    这就是为什么要使用servlet过滤器。
    Servlet过滤器是可插入的Java组件,我们可以使用它们来拦截和处理请求,然后再将请求发送到Servlet,并在Servlet代码完成之后以及容器将响应发送回客户端之前进行响应。
    :将请求参数记录到日志文件。

  • 对资源请求的身份验证和授权。

  • 在将请求正文或者标头发送到servlet之前进行格式化。

  • 压缩发送给客户端的响应数据。

  • 通过添加一些cookie,标头信息等来更改响应。

如前所述,servlet过滤器是可插入的,并在部署描述符(web.xml)文件中进行配置。
Servlet和过滤器彼此都不知道,我们可以仅通过编辑web.xml来添加或者删除Servlet过滤器。

We can have multiple filters for a single resource and we can create a chain of filters for a single resource in web.xml. We can create a Servlet Filter by implementing javax.servlet.Filterinterface.- Servlet过滤器接口Servlet过滤器接口类似于Servlet接口,我们需要对其进行实现以创建我们自己的Servlet过滤器。
Servlet过滤器接口包含过滤器的生命周期方法,并由servlet容器管理。
Servlet过滤器接口生命周期的方法有:void init(FilterConfig paramFilterConfig)–容器初始化过滤器时,这就是被调用的方法。
该方法在过滤器的生命周期中仅被调用一次,我们应该初始化该方法中的所有资源。
容器使用FilterConfig向过滤器提供初始化参数和servlet上下文对象。
我们可以在这种方法中抛出ServletException。

  • doFilter(ServletRequest paramServletRequest,ServletResponse paramServletResponse,FilterChain paramFilterChain)–这是每次容器必须将过滤器应用于资源时调用的方法。
    容器提供请求和响应对象引用以将筛选器作为参数。
    FilterChain用于调用链中的下一个过滤器。
    这是"责任链模式"的一个很好的例子。

  • void destroy()–当容器卸载Filter实例时,它将调用destroy()方法。
    这是我们可以关闭由过滤器打开的任何资源的方法。
    此方法在过滤器的生命周期中仅被调用一次。

  • Servlet 3.0中引入了Servlet WebFilter批注Javax.servlet.annotation.WebFilter,我们可以使用此批注来声明Servlet过滤器。
    我们可以使用此注释来定义初始化参数,过滤器名称和描述,servlet,URL模式和分派器类型以应用过滤器。
    如果您经常更改过滤器配置,则最好使用web.xml,因为这将不需要您重新编译过滤器类。
    阅读:Java注释教程

  • web.xml中的Servlet过滤器配置我们可以在web.xml中声明一个Servlet过滤器,如下所示。

我们可以将Filter映射到如下所示的servlet类或者url模式。

注意:在为servlet创建过滤器链时,容器首先处理url模式,然后处理servlet名称,因此,如果必须确保按特定顺序执行过滤器,请在定义过滤器映射时格外注意。
Servlet过滤器通常用于客户端请求,但有时我们也希望将过滤器与RequestDispatcher一起应用,在这种情况下,我们可以使用dispatcher元素,可能的值为REQUEST,FORWARD,INCLUDE,ERROR和ASYNC。
如果未定义调度程序,则该调度程序仅适用于客户请求。

  • 用于日志记录和会话验证的Servlet过滤器示例在我们的Servlet过滤器示例中,我们将创建过滤器来记录请求cookie和参数,并验证除静态HTML和LoginServlet之外的所有资源的会话,因为它没有会话。
    我们将创建一个动态Web项目ServletFilterExample,其项目结构如下图所示:image.login.html是我们应用程序的入口,用户将其中提供用于身份验证的登录ID和密码。
    login.html代码:
    LoginServlet用于验证来自客户端的登录请求。

客户端通过身份验证后,将转发到LoginSuccess.jspLoginSuccess.jsp代码:
请注意,上述JSP中没有会话验证逻辑。
它包含指向另一个JSP页面的链接,即CheckoutPage.jsp.CheckoutPage.jsp代码:
当客户端单击任何JSP页面中的Logout按钮时,将调用LogoutServlet。

现在,我们将创建日志记录和身份验证Servlet过滤器类。

请注意,我们没有认证任何HTML页面或者LoginServlet。
现在,我们将在web.xml文件中配置这些过滤器映射。

现在,当我们运行应用程序时,我们将获得如下图所示的响应页面。
如果您尚未登录并尝试访问任何JSP页面,则会将您转发到登录页面。
在服务器日志文件中,您可以看到Servlet过滤器以及Servlet编写的日志。