返回

Spring MVC中的拦截器与过滤器

后端


Spring MVC中的拦截器和过滤器都是用于处理请求的组件,它们可以在请求到达Controller之前或之后对请求进行处理,从而实现一些常见的功能,例如:身份验证、日志记录、性能监控等。

一、拦截器

拦截器是在Spring MVC中用于处理请求的组件,它可以对请求进行拦截,并在请求到达Controller之前或之后执行一些操作。拦截器的主要工作原理如下:

  1. 当一个请求到达Spring MVC时,DispatcherServlet会根据请求的URL找到对应的HandlerMapping,然后根据HandlerMapping找到对应的Handler。

  2. 在DispatcherServlet调用Handler之前,会先调用所有的拦截器,拦截器可以对请求进行拦截,并可以在请求到达Controller之前或之后执行一些操作。

  3. 如果拦截器不阻止请求,则DispatcherServlet会调用Handler来处理请求。

  4. 在Handler处理请求之后,DispatcherServlet会再次调用所有的拦截器,拦截器可以对请求的响应进行拦截,并可以在请求到达视图解析器之前或之后执行一些操作。

常用的拦截器类型有:

  • 身份验证拦截器:用于对请求进行身份验证,并阻止未经授权的请求访问受保护的资源。

  • 日志记录拦截器:用于记录请求的相关信息,以便进行故障排查和性能分析。

  • 性能监控拦截器:用于监控请求的性能,并生成性能报告。

二、过滤器

过滤器也是在Spring MVC中用于处理请求的组件,它可以在请求到达DispatcherServlet之前对请求进行处理,从而实现一些常见的功能,例如:压缩请求、加密请求、添加请求头等。过滤器的主要工作原理如下:

  1. 当一个请求到达Spring MVC时,会先经过所有的过滤器。

  2. 过滤器可以对请求进行处理,例如:压缩请求、加密请求、添加请求头等。

  3. 如果过滤器不阻止请求,则请求会继续到达DispatcherServlet,由DispatcherServlet进行后续处理。

常用的过滤器类型有:

  • 压缩过滤器:用于压缩请求的正文,以减少网络流量。

  • 加密过滤器:用于加密请求的正文,以保护数据安全。

  • 添加请求头过滤器:用于向请求中添加请求头,以便在服务器端进行身份验证、授权等操作。

三、如何使用Spring MVC的拦截器和过滤器

在Spring MVC中使用拦截器和过滤器非常简单,只需要在Spring配置文件中进行配置即可。例如,要在Spring MVC中使用身份验证拦截器,可以按照以下步骤进行操作:

  1. 在Spring配置文件中配置身份验证拦截器:
<mvc:interceptors>
  <mvc:interceptor>
    <mvc:mapping path="/secure/**" />
    <bean class="com.example.demo.interceptor.AuthenticationInterceptor" />
  </mvc:interceptor>
</mvc:interceptors>
  1. 实现身份验证拦截器:
public class AuthenticationInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    // 检查用户是否已登录
    if (request.getSession().getAttribute("user") == null) {
      // 如果用户未登录,则重定向到登录页面
      response.sendRedirect("/login");
      return false;
    }

    // 如果用户已登录,则继续执行请求
    return true;
  }

}
  1. 在Spring配置文件中配置过滤器:
<filter-mappings>
  <filter-mapping>
    <filter-name>CompressionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</filter-mappings>
  1. 实现过滤器:
public class CompressionFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // 压缩请求的正文
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    httpResponse.addHeader("Content-Encoding", "gzip");
    GZipOutputStream gzos = new GZipOutputStream(httpResponse.getOutputStream());
    ServletOutputStream sos = new ServletOutputStream() {
      @Override
      public void write(int b) throws IOException {
        gzos.write(b);
      }

      @Override
      public void close() throws IOException {
        gzos.close();
      }
    };
    HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(httpResponse) {
      @Override
      public ServletOutputStream getOutputStream() throws IOException {
        return sos;
      }
    };

    // 继续执行请求
    chain.doFilter(httpRequest, wrappedResponse);
  }

}

四、结语

拦截器和过滤器是Spring MVC中非常重要的组件,它们可以在请求到达Controller之前或之后对请求进行处理,从而实现一些常见的功能,例如:身份验证、日志记录、性能监控等。Spring MVC的拦截器和过滤器非常灵活,可以根据需要进行配置,以实现不同的功能。