目录

  1. 过滤器的作用与工作原理
  2. 创建和配置过滤器
  1. 常见的过滤器应用
  1. 示例代码
  2. 参考资料

过滤器的作用与工作原理

JSP 过滤器(Filter)是 Java Servlet 规范的一部分,用于拦截客户端请求和服务器响应,在请求到达 JSP/Servlet 或响应返回客户端前执行预处理或后处理任务。过滤器通过实现 javax.servlet.Filter 接口工作,常用于日志记录、权限验证、字符编码设置等。

过滤器的工作原理基于责任链模式,请求和响应通过过滤器链(Filter Chain)依次处理。


创建和配置过滤器

2.1 实现 Filter 接口

  • 方法
  • init(FilterConfig config):初始化过滤器。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain):执行过滤逻辑。
  • destroy():销毁过滤器。
  • 示例
  import javax.servlet.*;
  import java.io.IOException;

  public class MyFilter implements Filter {
      public void init(FilterConfig config) throws ServletException {
          // 初始化代码
      }

      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
          // 前置处理
          System.out.println("请求被拦截");
          chain.doFilter(request, response); // 放行到下一个过滤器或目标资源
          // 后置处理
      }

      public void destroy() {
          // 清理代码
      }
  }

2.2 配置过滤器

  • 方式 1:在 web.xml 中配置
  <filter>
      <filter-name>MyFilter</filter-name>
      <filter-class>com.example.MyFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 方式 2:使用注解(Servlet 3.0+)
  import javax.servlet.annotation.WebFilter;

  @WebFilter("/*")
  public class MyFilter implements Filter {
      // 同上实现
  }

常见的过滤器应用

3.1 字符编码过滤

  • 作用:统一设置请求和响应的字符编码,避免乱码。
  • 示例
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
      request.setCharacterEncoding("UTF-8");
      response.setCharacterEncoding("UTF-8");
      chain.doFilter(request, response);
  }

3.2 权限验证过滤

  • 作用:检查用户是否登录,未登录则重定向到登录页面。
  • 示例
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse resp = (HttpServletResponse) response;
      HttpSession session = req.getSession(false);
      if (session == null || session.getAttribute("user") == null) {
          resp.sendRedirect("login.jsp");
      } else {
          chain.doFilter(request, response);
      }
  }

示例代码

  • 字符编码过滤器
  import javax.servlet.*;
  import java.io.IOException;

  @WebFilter("/*")
  public class EncodingFilter implements Filter {
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
          request.setCharacterEncoding("UTF-8");
          response.setCharacterEncoding("UTF-8");
          chain.doFilter(request, response);
      }
      public void init(FilterConfig config) {}
      public void destroy() {}
  }
  • JSP 页面(test.jsp):
  <%@ page contentType="text/html;charset=UTF-8" %>
  <%
      String input = request.getParameter("input");
      out.println("输入内容: " + input);
  %>

参考资料

  1. Oracle 官方文档
  1. JavaTpoint JSP 教程
  1. TutorialsPoint JSP 过滤器

如果需要更复杂的过滤器示例或有其他问题,请告诉我!