首頁 >Java >java教程 >怎麼在Springboot實現攔截器功能

怎麼在Springboot實現攔截器功能

WBOY
WBOY轉載
2023-05-14 10:55:183586瀏覽

怎麼在Springboot實現攔截器功能

preHandle: #預先處理,在目標的controller方法執行之前,進行處理

postHandle: #在目標的controller方法執行之後,到達指定頁面之前進行處理

afterCompletion: 在頁面渲染之後進行處理

##方法:

1.Springboot透過實作HandlerInterceptor介面實作攔截器

2.透過WebMvcConfigurer實作一個組態類別,再透過@Configuration 註解注入到容器

#3 .指定攔截規則

 以使用者登入為案例,若使用者沒有登入session裡面就沒有使用者的資料,就會轉到首頁登入頁面​​

在正確登入之後,就將reglister儲存到session中,再次存取頁面的時候,登入攔截器就可以找到這個reglister對象,就不需要再攔截到登入介面了.

怎麼在Springboot實現攔截器功能

##

package com.zwz.springbootweb.interceptor;
 
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
 
public class LoginInterceptor implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object reglister = session.getAttribute("Reglister");
 
 
        if (reglister != null) {
            return true;
        } else {
            request.setAttribute("msg", "请先登录!");
 
            request.getRequestDispatcher("/").forward(request,response);
            return false;
        }
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
怎麼在Springboot實現攔截器功能 之後透過實作WebMvcConfigurer介面實現一個設定類,在設定類中註入攔截器,最後再透過@Configuration 註解注入設定.並且指定攔截的路徑和需要放行的路徑.

注意:

攔截器  /**   會攔截一切資源,包含靜態資源,需要將靜態資源放行

package com.zwz.springbootweb.config;
 
import com.zwz.springbootweb.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;
 
 
@Configuration
public class WebConfig implements WebMvcConfigurer{
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/loginjudge","/","/retolo","/static/**");
    }
}
怎麼在Springboot實現攔截器功能

# 攔截器的應用場景

1、日誌記錄:記錄請求資訊的日誌,以便進行資訊監控、資訊統計、計算PV(Page VIEW)等。

2、權限檢查:如登入偵測,進入處理器偵測偵測是否登錄,若沒有直接回到登入頁面;

3、效能監控:有時候系統在某段時間莫名其妙的慢,可以透過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

4、通用行為:讀取cookie得到使用者資訊並將使用者物件放入請求,從而方便後續流程使用,還有如提取Locale、Theme資訊等,只要是多個處理器都需要的即可使用攔截器實現。

5、OpenSessionInView:如Hibernate,在進入處理器開啟SESSION,在完成後關閉SESSION。

攔截器與過濾器的區別

1、攔截器是基於Java的反射機制的,而過濾器是基於函數回呼。

2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。

3、攔截器只能對ACTION請求起作用,而過濾器則可以對幾乎所有的請求起作用。

4、攔截器可以存取ACTION上下文、值堆疊裡的對象,而過濾器不能存取。

5、在ACTION的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。

6、攔截器可以取得IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。

以上是怎麼在Springboot實現攔截器功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除