📜  Servlet – 过滤器(1)

📅  最后修改于: 2023-12-03 15:05:11.032000             🧑  作者: Mango

Servlet – 过滤器

Servlet过滤器是一种可以检查和处理Web应用程序请求和响应的组件。过滤器在处理请求之前预处理它们,以便在传递到目标资源之前修改请求内容、请求头或响应。此外,过滤器可以在返回到客户端之前预处理响应。

过滤器可以用于以下目的:

  • 对请求进行验证,如身份验证和授权;
  • 对请求进行修改,如请求内容和请求头;
  • 对响应进行修改,如响应内容和响应头;
  • 过滤特定请求和响应类型;
  • 追踪和记录请求和响应。
过滤器工作原理

当Servlet容器收到一个HTTP请求时,它会在请求到达目标Servlet之前执行所有相关过滤器。过滤器通常通过以下方式获取请求和响应对象:

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

然后可以通过这些对象修改请求和响应。在本例中,我们将示例过滤器配置为修改请求URI、名称和请求属性:

public class ExampleFilter implements Filter {
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    
    String name = request.getParameter("name");
    String newName = "新" + name;
    
    request.setAttribute("name", newName);
    request.getRequestDispatcher(newName).forward(request, response);
  }
}

在这个例子中,请求的名称被修改,并在请求上设置了一个新的属性。然后,请求将被转发到一个Servlet或JSP,该Servlet或JSP将使用新的名称进行处理。

创建和应用过滤器

创建过滤器需要实现javax.servlet.Filter接口。过滤器仅需覆盖doFilter()方法,该方法必须调用传递给它的FilterChain参数的doFilter()方法。

下面是一个简单的实现示例:

public class ExampleFilter implements Filter {
  public void init(FilterConfig filterConfig) throws ServletException { }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // 实现过滤逻辑

    chain.doFilter(request, response);
  }
  public void destroy() { }
}

要使用过滤器,需要在web.xml文件中将其映射到要执行过滤的URL模式上。例如,以下web.xml片段将ExampleFilter映射到所有以“/example/*”开头的URL:

<filter>
  <filter-name>ExampleFilter</filter-name>
  <filter-class>com.example.ExampleFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>ExampleFilter</filter-name>
  <url-pattern>/example/*</url-pattern>
</filter-mapping>
过滤器链

当同时使用多个过滤器时,可以使用过滤器链来指定它们的顺序。过滤器只按其在web.xml文件中出现的顺序执行,但是过滤器链顺序可能会更改。可以通过以下方式手动设置过滤器链顺序:

<filter-mapping>
  <filter-name>Filter1</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

<filter-mapping>
  <filter-name>Filter2</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

在上面的示例中,两个过滤器都被映射到“/*”URL模式,但是Filter1是在Filter2之前运行,因为它声明在web.xml中的位置更靠前。