教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

过滤器与拦截器的区别是什么?

更新时间:2023年07月05日09时24分 来源:传智教育 浏览次数:

好口碑IT培训

  在Java中,过滤器(Filter)和拦截器(Interceptor)是用于在Web应用程序中执行特定任务的组件。它们的目的是拦截请求和响应,并在处理它们之前或之后执行某些操作。虽然它们的目标相似,但它们在实现方式和应用场景上存在一些区别。

  1.过滤器(Filter)

  (1)过滤器是基于Java Servlet规范的一部分,它可以在请求到达Servlet之前进行预处理或在响应离开Servlet之后进行后处理。

  (2)过滤器是基于URL模式进行配置的,可以指定要拦截的URL或URL模式。

  (3)过滤器可以对请求和响应进行修改、重定向、日志记录等操作。

  (4)过滤器可以链式调用,允许多个过滤器按顺序处理请求和响应。

  下面是一个简单的过滤器示例,它记录请求的URL和执行时间:

import javax.servlet.*;
import java.io.IOException;

public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig config) throws ServletException {
        // 初始化过滤器
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        String url = ((HttpServletRequest) request).getRequestURL().toString();
        System.out.println("Request URL: " + url);
        
        // 调用下一个过滤器或Servlet
        chain.doFilter(request, response);

        long endTime = System.currentTimeMillis();
        System.out.println("Execution Time: " + (endTime - startTime) + "ms");
    }

    @Override
    public void destroy() {
        // 销毁过滤器
    }
}

  2.拦截器(Interceptor)

  (1)拦截器是在Spring框架中的一种特性,它可以在请求处理的不同阶段进行拦截和处理。

  (2)拦截器可以在控制器(Controller)的方法调用之前或之后执行自定义逻辑。

  (3)拦截器可以访问控制器方法的参数、返回值和异常信息,并进行相应的处理。

  (4)拦截器可以在Spring配置文件中进行声明和配置,也可以使用注解方式进行配置。

  接下来我们再看一个拦截器示例,它记录控制器方法的执行时间:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TimingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        long endTime = System.currentTimeMillis();
        long startTime = (Long) request.getAttribute("startTime");
        long executionTime = endTime - startTime;
        System.out.println("Execution Time: " + executionTime + "ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        // 在请求处理完成后执行的操作
    }
}

  需要注意的是,过滤器是基于Servlet规范的一部分,而拦截器是Spring框架的特性。过滤器可以应用于任何Java Web应用程序,而拦截器仅适用于使用Spring框架构建的应用程序。

0 分享到:
和我们在线交谈!