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

點(diǎn)擊下一步后 ,選擇2.4.1的SpringBoot版本 ,導(dǎo)入Spring Web依賴后點(diǎn)擊完成即可。

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

具體編輯的攔截器如下所示:代碼中的url請(qǐng)求將在controlelr控制器中編寫(xiě)。另外需要注意的是User是一個(gè)實(shí)體類,包括id與username兩個(gè)屬性以及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 自定義的類才算是一個(gè)攔截器
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//編寫(xiě)攔截的規(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.注冊(cè)攔截器
編寫(xiě)完自定義的攔截器后,我們還需要將自定義的攔截器注冊(cè)到Java的配置類中,方便SpringBoot項(xiàng)目啟動(dòng)的時(shí)候讀取Config配置類。
我們需要?jiǎng)?chuàng)建一個(gè)類,實(shí)現(xiàn)WebMvcConfigurer接口并在類名上使用 @Configuration注解 表明這是一個(gè)配置類,其實(shí)就類似于我們?cè)赟pringMVC中的XML配置文件,不過(guò)現(xiàn)在就用純Java代碼配置而已。
然后在該類中實(shí)現(xiàn) addInterceptors方法,從而把需要攔截的請(qǐng)求以及需要排除的請(qǐng)求注冊(cè)進(jìn)去,方便項(xiàng)目啟動(dòng)后的讀取。
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;
//表明這是一個(gè)配置類 即相當(dāng)于之前的xml配置文件
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
//這個(gè)配置類主要用來(lái)添加攔截請(qǐng)求
@Override
public void addInterceptors(InterceptorRegistry registry) {
String[] addPathPatterns={
"/user/**"
};//設(shè)置攔截的路徑 不設(shè)置將會(huì)攔截所有的請(qǐng)求
String[] excludePathPatterns={
"/user/out",
"/user/error",
"/user/login"
};//要排除的路徑 排除的路徑說(shuō)明不需要用戶登錄也可以訪問(wèn)
//InterceptorRegistry 攔截器注冊(cè)類
registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
// WebMvcConfigurer.super.addInterceptors(registry);
}
}
4.編寫(xiě)控制器
前面展示了不少的url請(qǐng)求,相信沒(méi)有看到具體的控制器一定有點(diǎn)暈頭轉(zhuǎn)向的,這就展示控制器的具體代碼,如下所示:
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 //該注解相當(dāng)于@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login")
public String login(HttpServletRequest request){
//這里只是模擬登錄 一旦輸入該請(qǐng)求 則表示登錄成功 便我往session中存值
User user = new User();
user.setId(1001);
user.setUsername("張三");
//將用戶的信息存放到session中
request.getSession().setAttribute("user",user);
return "login success";
}
//該請(qǐng)求需要用戶登錄之后才可訪問(wèn)
@RequestMapping("/center")
public String center(){
return "See Center Message";
}
//該請(qǐng)求不登錄也可以訪問(wèn)
@RequestMapping("/out")
public String out(){
return "Out See anytime";
}
//如果用戶未登錄訪問(wèn)了需要登錄的請(qǐng)求 便會(huì)自動(dòng)跳轉(zhuǎn)到該路徑
@RequestMapping("/error")
public String error(){
return "error";
}
}
通過(guò)查看控制器的代碼相信大多數(shù)小伙伴就能猜測(cè)到具體項(xiàng)目演示的結(jié)果了,這里就不具體展示運(yùn)行的效果了。
總結(jié)
到此這篇關(guān)于在SpringBoot項(xiàng)目中整合攔截器的文章就介紹到這了,更多相關(guān)SpringBoot項(xiàng)目整合攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目如何設(shè)置權(quán)限攔截器和過(guò)濾器
這篇文章主要介紹了使用lombok時(shí)如何自定義get、set方法問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn)
本文主要介紹了SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn),包括服務(wù)注冊(cè)、服務(wù)拉取、負(fù)載均衡和實(shí)例權(quán)重配置等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
Spring?IOC容器FactoryBean工廠Bean實(shí)例
這篇文章主要為大家介紹了Spring?IOC容器FactoryBean工廠Bean實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
java編寫(xiě)一個(gè)花名隨機(jī)抽取器的實(shí)現(xiàn)示例
這篇文章主要介紹了java編寫(xiě)一個(gè)花名隨機(jī)抽取器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
SpringBoot項(xiàng)目如何連接MySQL8.0數(shù)據(jù)庫(kù)
這篇文章主要介紹了SpringBoot項(xiàng)目如何連接MySQL8.0數(shù)據(jù)庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
詳解Maven POM(項(xiàng)目對(duì)象模型)
這篇文章主要介紹了Maven POM(項(xiàng)目對(duì)象模型)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
MyEclipse+Tomcat+MAVEN+SVN項(xiàng)目完整環(huán)境搭建(圖文教程)
這篇文章主要介紹了MyEclipse+Tomcat+MAVEN+SVN項(xiàng)目完整環(huán)境搭建(圖文教程),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-12-12
Java工程mybatis實(shí)現(xiàn)多表查詢過(guò)程詳解
這篇文章主要介紹了Java工程mybatis實(shí)現(xiàn)多表查詢過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
java 算法之希爾排序詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了java 算法之希爾排序詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
Spring?Get請(qǐng)求與post請(qǐng)求的實(shí)現(xiàn)
在Spring中,GET請(qǐng)求和POST請(qǐng)求是兩種常見(jiàn)的HTTP請(qǐng)求方法,用于與服務(wù)器進(jìn)行交互,本文詳細(xì)的介紹一下Spring?Get請(qǐng)求與post請(qǐng)求的實(shí)現(xiàn),感興趣的可以了解一下2023-10-10

