Spring Boot 配置攔截器方式

来源:https://www.cnblogs.com/lhboke/archive/2020/07/07/13263395.html
-Advertisement-
Play Games

其實spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要註意下就ok了。下麵主要介紹兩種常用的攔截器: 一、基於URL實現的攔截器: public class LoginInterceptor extends HandlerInterceptor{ /** * 在請 ...


其實spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要註意下就ok了。下麵主要介紹兩種常用的攔截器:

一、基於URL實現的攔截器:

public class LoginInterceptor extends HandlerInterceptor{
/** * 在請求處理之前進行調用(Controller方法調用之前) * 基於URL實現的攔截器 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String path = request.getServletPath(); if (path.matches(Const.NO_INTERCEPTOR_PATH)) { //不需要的攔截直接過 return true; } else { // 這寫你攔截需要乾的事兒,比如取緩存,SESSION,許可權判斷等 System.out.println("===================================="); return true; } } }

關鍵代碼:path.matches(Const.NO_INTERCEPTOR_PATH 就是基於正則匹配的url。

import com.example.demo1.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


/**
*
*
* @Package: com.*.*.config
* @ClassName: LoginConfig
* @Description:攔截器配置
* @author: zk
* @date: 2019年9月19日 下午2:18:35
*/
@Configuration
public class LoginConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
//註冊TestInterceptor攔截器
InterceptorRegistration registration = registry.addInterceptor(new LoginInterceptor());
registration.addPathPatterns("/**"); //所有路徑都被攔截

}
}

 

/**
 * @author 	BianP
 * @explain 常量類
 */
public class Const {

    public static final String SUCCESS = "SUCCESS";
    public static final String ERROR = "ERROR";
    public static final String FIALL = "FIALL";
    /**********************對象和個體****************************/
    public static final String SESSION_USER = "loginedAgent"; // 用戶對象
    public static final String SESSION_LOGINID = "sessionLoginID"; // 登錄ID
    public static final String SESSION_USERID = "sessionUserID"; // 當前用戶對象ID編號

    public static final String SESSION_USERNAME = "sessionUserName"; // 當前用戶對象ID編號
    public static final Integer PAGE = 10; // 預設分頁數
    public static final String SESSION_URL = "sessionUrl"; // 被記錄的url
    public static final String SESSION_SECURITY_CODE = "sessionVerifyCode"; // 登錄頁驗證碼
    // 時間 緩存時間
    public static final int TIMEOUT = 1800;// 秒
	public static final String ON_LOGIN = "/logout.htm";
	public static final String LOGIN_OUT = "/toLogout";
    // 不驗證URL anon:不驗證/authc:受控制的
    public static final String NO_INTERCEPTOR_PATH =".*/((.css)|(.js)|(images)|(login)|(anon)).*";
}

二、基於註解的攔截器

①創建註解:

/**
 * 在需要登錄驗證的Controller的方法上使用此註解
 */
@Target({ElementType.METHOD})// 可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 運行時有效
public @interface LoginRequired {
	
}

②創建攔截器:

public class AuthorityInterceptor extends HandlerInterceptorAdapter{
	
	 @Override
	 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
	 	// 如果不是映射到方法直接通過
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        // ①:START 方法註解級攔截器
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        // 判斷介面是否需要登錄
        LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
        // 有 @LoginRequired 註解,需要認證
        if (methodAnnotation != null) {
            // 這寫你攔截需要乾的事兒,比如取緩存,SESSION,許可權判斷等
            System.out.println("====================================");
            return true;
        }
        return true;
	}
}

三、把攔截器添加到配置中,相當於SpringMVC時的配置文件乾的事兒:

/**
 * 和springmvc的webmvc攔截配置一樣
 * @author BIANP
 */
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
	 @Override
	 public void addInterceptors(InterceptorRegistry registry) {
        // 攔截所有請求,通過判斷是否有 @LoginRequired 註解 決定是否需要登錄
        registry.addInterceptor(LoginInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(AuthorityInterceptor()).addPathPatterns("/**");
	 }
	 
	 @Bean
	 public LoginInterceptor LoginInterceptor() {
		 return new LoginInterceptor();
	 }
	 
	 @Bean
	 public AuthorityInterceptor AuthorityInterceptor() {
		 return new AuthorityInterceptor();
	 }
}

1、一定要加@Configuration  這個註解,在啟動的時候在會被載入。

2、有一些教程是用的“WebMvcConfigurerAdapter”,不過在spring5.0版本後這個類被丟棄了 WebMvcConfigurerAdapter  ,雖然還可以用,但是看起來不好。

3、也有一些教程使用的WebMvcConfigurationSupport,我使用後發現,classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。具體可以原因,大家可以看下源碼因為:WebMvcAutoConfiguration上有個條件註解:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

所以還是建議使用WebMvcConfigurer, 其實springMVC很多東西,都可以搬到springboot中來使用,只需要把配置文件的模式,改成 對應@Configuration 類就好了。

HandlerInterceptor

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (1) 相關博文地址: SpringBoot + Vue + ElementUI 實現後臺管理系統模板 -- 前端篇(一):搭建基本環境:https://www.cnblogs.com/l-y-h/p/12930895.html SpringBoot + Vue + ElementUI 實現後臺管理 ...
  • 1、Django簡介 Django是Python語言中的一個web框架,Python語言中主流的web框架有Django、Tornado、Flask 等多種。Django相較與其它WEB框架,其優勢為: ​ 大而全,框架本身集成了ORM、模型綁定、模板引擎、緩存、Session等功能,是一個全能型框 ...
  • ## Java 集合框架 學習目標 會使用集合存儲數據 遍歷集合,取出數據 掌握每種集合的特性 學習方法 學習頂層!通過頂層介面/抽象類的共性方法,所有子類都可以使用 使用底層!頂層無法創建對象,需要使用具體的實現類創建對象 框架圖 第一章 Collction集合 一種工具,放在java.util ...
  • 前言 上一篇分析Mybatis是如何載入解析XML文件的,本篇緊接上文,分析Mybatis的剩餘兩個階段:代理封裝和SQL執行。 正文 代理封裝 Mybatis有兩種方式調用Mapper介面: private static SqlSessionFactory sqlMapper = new SqlS ...
  • 申請開放平臺 ,並綁定公眾號和小程式 小程式授權登錄獲取unionID 公眾號關註時獲取unnionID,並查詢是否unionID是否存在,然後存在,更新公眾號openid信息,不存在則新建 參考文檔: 公眾號unionID機制: https://developers.weixin.qq.com/d ...
  • 案例故事:Android手機音視頻圖片解碼播放測試,有將近上千條用例, 包含了不同的音視頻圖片文件,每條用例都至少對應了一個測試資源文件。 整個測試資源倉庫,將近100G,一些視頻比如High Profile 5.2規格的,一個就500M, 如果每次測試都需要adb push導入這麼多測試資源文件到 ...
  • 最近新開發的項目中需要使用到國際化功能,項目是基於SpringBoot來進行開發,藉此機會整理一篇關於SpringBoot實現國際化i18n功能的文章,分享給大家。 依賴引入 在Spring Boot的web項目中無需引入其他特殊的配置,預設的web starter中便已經涵蓋了所需的基礎組件。對應 ...
  • 1.file類的方法 1.getName():獲取文件名 2.getPath():獲取文件路徑,設定是相對路徑得到的就是相對路徑,絕對路徑同里 3.getAbsolutePath():獲取文件絕對路徑 4.getParent():獲取文件父類路徑 5.exists():判斷文件是否存在 6.isFi ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...