教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

過濾器與攔截器的區(qū)別是什么?

更新時(shí)間:2023年07月05日09時(shí)24分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  在Java中,過濾器(Filter)和攔截器(Interceptor)是用于在Web應(yīng)用程序中執(zhí)行特定任務(wù)的組件。它們的目的是攔截請(qǐng)求和響應(yīng),并在處理它們之前或之后執(zhí)行某些操作。雖然它們的目標(biāo)相似,但它們?cè)趯?shí)現(xiàn)方式和應(yīng)用場(chǎng)景上存在一些區(qū)別。

  1.過濾器(Filter)

  (1)過濾器是基于Java Servlet規(guī)范的一部分,它可以在請(qǐng)求到達(dá)Servlet之前進(jìn)行預(yù)處理或在響應(yīng)離開Servlet之后進(jìn)行后處理。

  (2)過濾器是基于URL模式進(jìn)行配置的,可以指定要攔截的URL或URL模式。

  (3)過濾器可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行修改、重定向、日志記錄等操作。

  (4)過濾器可以鏈?zhǔn)秸{(diào)用,允許多個(gè)過濾器按順序處理請(qǐng)求和響應(yīng)。

  下面是一個(gè)簡(jiǎn)單的過濾器示例,它記錄請(qǐng)求的URL和執(zhí)行時(shí)間:

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);
        
        // 調(diào)用下一個(gè)過濾器或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框架中的一種特性,它可以在請(qǐng)求處理的不同階段進(jìn)行攔截和處理。

  (2)攔截器可以在控制器(Controller)的方法調(diào)用之前或之后執(zhí)行自定義邏輯。

  (3)攔截器可以訪問控制器方法的參數(shù)、返回值和異常信息,并進(jìn)行相應(yīng)的處理。

  (4)攔截器可以在Spring配置文件中進(jìn)行聲明和配置,也可以使用注解方式進(jìn)行配置。

  接下來我們?cè)倏匆粋€(gè)攔截器示例,它記錄控制器方法的執(zhí)行時(shí)間:

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 {
        // 在請(qǐng)求處理完成后執(zhí)行的操作
    }
}

  需要注意的是,過濾器是基于Servlet規(guī)范的一部分,而攔截器是Spring框架的特性。過濾器可以應(yīng)用于任何Java Web應(yīng)用程序,而攔截器僅適用于使用Spring框架構(gòu)建的應(yīng)用程序。

0 分享到:
和我們?cè)诰€交談!