天天看點

過濾器,監聽器,攔截器

轉自:

https://blog.csdn.net/yudiandemingzi/article/details/80399971

過濾器,監聽器,攔截器

一、了解它們

    看裡十幾篇部落格,總算有點小明白,總的來講,兩張圖可以讓我看明白點。

   通過兩幅圖我們可以了解攔截器和過濾器的特點

1、過濾器

  過濾器是在請求進入tomcat容器後,但請求進入servlet之前進行預處理的。請求結束傳回也是,是在servlet處理完後,傳回給前端之前。

      了解上面這句話我們就可以知道,進入servlet之前,主要是兩個參數:ServletRequest,ServletResponse  那我們得到這兩個測試可以幹哪些事呢?

     我們可以通過ServletRequest得到HttpServletRequest,此時你就可以對請求或響應(Request、Response)那就可以對對web伺服器管理的所有web資源:例如Jsp, Servlet, 靜态圖檔檔案或靜态 html 檔案等進行攔截,進而實作一些特殊的功能。例如實作URL級别的權限通路控制、過濾敏感詞彙、壓縮響應資訊、字元集統一等一些進階功能。它主要用于對使用者請求進行預處理,也可以對HttpServletResponse進行後處理。使用Filter的完整流程:Filter對使用者請求進行預處理,接着将請求交給Servlet進行處理并生成響應,最後Filter再對伺服器響應進行後處理。。它是随你的web應用啟動而啟動的,隻初始化一次,以後就可以攔截相關請求,隻有當你的web應用停止或重新部署的時候才銷毀。(每次熱部署後,都會銷毀)。

2、攔截器

從上圖我們可以看出過濾器隻在servlet前後起作用,是以它既不能捕獲異常,獲得bean對象等,這些是隻能是進入servlet裡面的攔截器能過做到。攔截器中用于在某個方法或字段被通路之前,進行攔截然後,在之前或之後加入某些操作。比如日志,安全等。一般攔截器方法都是通過動态代理的方式實作。可以通過它來進行權限驗證,或者判斷使用者是否登陸,或者是像12306 判斷目前時間是否是購票時間。

對比一下其實我們可以發現,過濾器能做的事攔截器都能做,二攔截器做的事過濾器不一定做的了。

3、監聽器

listener是servlet規範中定義的一種特殊類。用于監聽servletContext、HttpSession和servletRequest等域對象的建立和銷毀事件。監聽域對象的屬性發生修改的事件。用于在事件發生前、發生後做一些必要的處理。其主要可用于以下方面:1、統計線上人數和線上使用者2、系統啟動時加載初始化資訊3、統計網站通路量4、記錄使用者通路路徑。

常用的監聽器 servletContextListener、httpSessionListener、servletRequestListener)

二、如何建立他們

自定義Filter 使用Servlet3.0的注解進行配置第三步的@WebFilter就是3.0的注解

       1)啟動類裡面增加 @ServletComponentScan,進行掃描

       2)建立一個Filter類,implements Filter,并實作對應的接口

        3) @WebFilter 标記一個類為filter,被spring進行掃描

        urlPatterns:攔截規則,支援正則

        4)控制chain.doFilter的方法的調用,來實作是否通過放行不放行,web應用resp.sendRedirect("/index.html");場景:權限控制、使用者登入(非前端後端分離場景)等

  application類

@SpringBootApplication

@ServletComponentScan

public class SpringbootstudyApplication {

public static void main(String[] args) {

SpringApplication.run(SpringbootstudyApplication.class, args);

}

}

  LoginFilter過濾器

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpServletResponseWrapper;

//過濾器攔截路徑

@WebFilter(urlPatterns = "/api/*", filterName = "loginFilter")

public class LoginFilter implements Filter{

/**

* 容器加載的時候調用

*/

@Override

public void init(FilterConfig filterConfig) throws ServletException {

System.out.println("攔截器進入========攔截器進入========");

}

/**

* 請求被攔截的時候進行調用

*/

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

System.out.println("攔截中========攔截中========");

HttpServletRequest hrequest = (HttpServletRequest)servletRequest;

HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);

if(hrequest.getRequestURI().indexOf("/index") != -1 ||

hrequest.getRequestURI().indexOf("/asd") != -1 ||

hrequest.getRequestURI().indexOf("/online") != -1 ||

hrequest.getRequestURI().indexOf("/login") != -1

) {

filterChain.doFilter(servletRequest, servletResponse);

}else {

wrapper.sendRedirect("/login");

}

* 容器被銷毀的時候被調用

public void destroy() {

System.out.println("攔截器銷毀========攔截器銷毀========");

1、官網位址:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners

二、監聽器

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

import javax.servlet.annotation.WebListener;

@WebListener

public class RequestListener implements ServletRequestListener {

@Override

public void requestDestroyed(ServletRequestEvent sre) {

// TODO Auto-generated method stub

System.out.println("======銷毀監聽器========");

public void requestInitialized(ServletRequestEvent sre) {

System.out.println("======進入監聽器========");

三、攔截器

CustomWebMvcConfigurer主攔截器需要:

    1:添加@Configuration注解

    2:實作WebMvcConfigurer接口

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//主攔截器,根據攔截不同路徑跳轉不同自定義攔截器 (實作WebMvcConfigurer方法)

@Configuration

public class CustomWebMvcConfigurer implements WebMvcConfigurer {

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api1/*/**");

registry.addInterceptor(new TwoIntercepter()).addPathPatterns("/api2/*/**");

//.excludePathPatterns("/api2/xxx/**"); //攔截全部 /*/*/**

WebMvcConfigurer.super.addInterceptors(registry);

LoginIntercepter子攔截器

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

public class LoginIntercepter implements HandlerInterceptor{

/**

* 進入controller方法之前

*/

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("LoginIntercepter------->preHandle");

// String token = request.getParameter("access_token");

//

// response.getWriter().print("fail");

return HandlerInterceptor.super.preHandle(request, response, handler);

* 調用完controller之後,視圖渲染之前

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("LoginIntercepter------->postHandle");

HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);

* 整個完成之後,通常用于資源清理

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("LoginIntercepter------->afterCompletion");

HandlerInterceptor.super.afterCompletion(request, response, handler, ex);

TwoIntercepter同上

github位址:源碼

最後總解一下他們:

過濾器:用于屬性甄别,對象收集(不可改變過濾對象的屬性和行為)

監聽器:用于對象監聽,行為記錄(不可改變監聽對象的屬性和行為)

攔截器:用于對象攔截,行為幹預(可以改變攔截對象的屬性和行為)

參考:

1.springboot配置監聽器、過濾器和攔截器

2.請教一下關于過濾器,攔截器,監聽器具體應用上的差別?

3.springboot過濾器和攔截器的實作和差別

————————————————

版權聲明:本文為CSDN部落客「Binronchar」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/yudiandemingzi/article/details/80399971

繼續閱讀