在SpringBoot項目中整合攔截器的詳細步驟
引言
攔截器在Web系統(tǒng)中非常常見,對于某些全局統(tǒng)一的操作,我們可以把它提取到攔截器中實現??偨Y起來,攔截器大致有以下幾種使用場景:
1.權限檢查:如登錄檢測,進入處理程序檢測用戶是否登錄,如果沒有,則直接返回登錄頁面或error錯誤頁面;
2.性能檢測:有時系統(tǒng)在某段時間莫名其妙很慢,我們可以通過攔截器在進入處理程序之前記錄開始時間,在處理完后記錄結束時間,從而得到該請求的處理時間;
3.通用行為;讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后序流程使用,還有提取Locale、Theme信息等,只要是多個處理程序都需要的,即可以使用功能攔截器實現。
下面我來詳細介紹如何在SpringBoot項目中搭建攔截器的步驟。
1.創(chuàng)建一個SpringBoot項目工程
打開IDEA,點擊文件,選擇新建項目,點擊Spring Initializr,然后根據自己的需求設置項目名稱,位置以及JDK。這里需要注意,服務器的URL最好設置為阿里云服務器,這樣可以使得項目加載地更快。

點擊下一步后 ,選擇2.4.1的SpringBoot版本 ,導入Spring Web依賴后點擊完成即可。

2.配置自定義的攔截器
在自定義的攔截器類中要繼承HandlerInterceptor,只有繼承了HandlerInterceptor 的類才算是一個攔截器,同時根據需求重寫preHandle,postHandle以及afterCompletion方法。

具體編輯的攔截器如下所示:代碼中的url請求將在controlelr控制器中編寫。另外需要注意的是User是一個實體類,包括id與username兩個屬性以及set,get方法,這里就不具體展示了。
package com.xing.springbootinterceptor.interceptor;
import com.xing.springbootinterceptor.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定義的攔截器 只有繼承了HandlerInterceptor 自定義的類才算是一個攔截器
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//編寫攔截的規(guī)則
//判斷用戶是否登錄 從session中取值
User user=(User) request.getSession().getAttribute("user");
if(user==null){
//未登錄
response.sendRedirect(request.getContextPath()+"/user/error");//重定向
return false;
}
return true;
}
@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);
}
}
3.注冊攔截器
編寫完自定義的攔截器后,我們還需要將自定義的攔截器注冊到Java的配置類中,方便SpringBoot項目啟動的時候讀取Config配置類。
我們需要創(chuàng)建一個類,實現WebMvcConfigurer接口并在類名上使用 @Configuration注解 表明這是一個配置類,其實就類似于我們在SpringMVC中的XML配置文件,不過現在就用純Java代碼配置而已。
然后在該類中實現 addInterceptors方法,從而把需要攔截的請求以及需要排除的請求注冊進去,方便項目啟動后的讀取。
package com.xing.springbootinterceptor.config;
import com.xing.springbootinterceptor.interceptor.UserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//表明這是一個配置類 即相當于之前的xml配置文件
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
//這個配置類主要用來添加攔截請求
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] addPathPatterns={
"/user/**"
};//設置攔截的路徑 不設置將會攔截所有的請求
String[] excludePathPatterns={
"/user/out",
"/user/error",
"/user/login"
};//要排除的路徑 排除的路徑說明不需要用戶登錄也可以訪問
//InterceptorRegistry 攔截器注冊類
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
// WebMvcConfigurer.super.addInterceptors(registry);
}
}
4.編寫控制器
前面展示了不少的url請求,相信沒有看到具體的控制器一定有點暈頭轉向的,這就展示控制器的具體代碼,如下所示:
package com.xing.springbootinterceptor.controller;
import com.xing.springbootinterceptor.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController //該注解相當于@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login")
public String login(HttpServletRequest request){
//這里只是模擬登錄 一旦輸入該請求 則表示登錄成功 便我往session中存值
User user = new User();
user.setId(1001);
user.setUsername("張三");
//將用戶的信息存放到session中
request.getSession().setAttribute("user",user);
return "login success";
}
//該請求需要用戶登錄之后才可訪問
@RequestMapping("/center")
public String center(){
return "See Center Message";
}
//該請求不登錄也可以訪問
@RequestMapping("/out")
public String out(){
return "Out See anytime";
}
//如果用戶未登錄訪問了需要登錄的請求 便會自動跳轉到該路徑
@RequestMapping("/error")
public String error(){
return "error";
}
}
通過查看控制器的代碼相信大多數小伙伴就能猜測到具體項目演示的結果了,這里就不具體展示運行的效果了。
總結
到此這篇關于在SpringBoot項目中整合攔截器的文章就介紹到這了,更多相關SpringBoot項目整合攔截器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot swagger配置過程詳解(idea社區(qū)版2023.1.4+apache-maven-3
這篇文章主要介紹了Springboot-swagger配置(idea社區(qū)版2023.1.4+apache-maven-3.9.3-bin),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
SpringBoot將所有依賴(包括本地jar包)打包到項目
這篇文章主要介紹了SpringBoot將所有依賴(包括本地jar包)打包到項目,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
JavaMail實現發(fā)送超文本(html)格式郵件的方法
這篇文章主要介紹了JavaMail實現發(fā)送超文本(html)格式郵件的方法,實例分析了java發(fā)送超文本文件的相關技巧,需要的朋友可以參考下2015-05-05

