SpringBoot 中對攔截器的簡單使用
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質(zhì)文章,第一時間送達
明確需求
我們的部分接口需要訪問者具有相應(yīng)的權(quán)限才能進行相應(yīng)的訪問,即需要有正確的通行密碼才能放行??吹竭@個需求,相應(yīng)大家腦海中瞬間浮現(xiàn)出一個詞 – 攔截器,確實,我們可以使用攔截器來實現(xiàn)這個需求,下面就讓我來帶領(lǐng)大家一起完成這個任務(wù)吧!
第一步:實現(xiàn)一個注解
首先,我們先實現(xiàn)一個注解,這個注解可以被加在方法上面,其主要功能如下:對于加上了這個注解的接口,會對其進行權(quán)限校驗,通過才能執(zhí)行下面的邏輯,否則會直接拋出異常。
package edu.szu.demo.annotation;import java.lang.annotation.*;// 作用于方法上// 運行期保留public Judge {public boolean need() default true;}
實現(xiàn)接口
我們的接口邏輯很簡單,對于傳入的字符串參數(shù),稍作修改便直接返回。而我們的接口使用了之前定義的 @Judge 注解,意味著該接口需要進行校驗。
package edu.szu.demo.controller;import edu.szu.demo.annotation.Judge;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController {/*** 該方法對傳入數(shù)據(jù)做一定的修改,然后將其返回* @param judgePassword 通行密碼,通過校驗才放行* @param name 傳入的數(shù)據(jù)* @return*/@Judge@RequestMapping("/test")public String test(String judgePassword, String name) {return name + " 已被修改";}}
實現(xiàn)一個攔截器
實現(xiàn)攔截器比較簡單,既可以實現(xiàn)接口 HandlerInterceptor ,也可以繼承抽象類 HandlerInterceptorAdapter,在這一步博主選擇了實現(xiàn)接口。
我們先來看看這個 HandlerInterceptor 接口是何方神圣。
public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}}
preHandle:在業(yè)務(wù)處理器處理請求之前被調(diào)用,可用于編碼、安全控制、權(quán)限校驗
postHandle:在業(yè)務(wù)處理器處理請求執(zhí)行完成后,生成視圖之前執(zhí)行
afterCompletion:在 DispatcherServlet 完全處理完請求后被調(diào)用,可用于清理資源
明白了 HandlerInterceptor 的構(gòu)造,我們便可以使用這個接口了。我們定義一個攔截器,該攔截器對于帶有 Judge 注解的請求,會進行判斷,若密碼不為 happy,會直接拋出異常,其余情況均會放行。
package edu.szu.demo.interceptor;import edu.szu.demo.annotation.Judge;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TestInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HandlerMethod handlerMethod = (HandlerMethod) handler;//獲取注解Judge judge = handlerMethod.getMethod().getAnnotation(Judge.class);if(judge != null && judge.need()) {String getJudgePassword = request.getParameter("judgePassword");//這里直接寫死,密碼必須設(shè)置為 happyif(!getJudgePassword.equals("happy")) {throw new Exception();}}return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}}
注冊攔截器
然后把我們前面寫好的攔截器注冊一下
package edu.szu.demo.config;import edu.szu.demo.interceptor.TestInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;public class WebAppConfigurer implements WebMvcConfigurer {public void addInterceptors(InterceptorRegistry registry) {// 攔截所有請求地址registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");}}
這樣子,我們的需求就已經(jīng)實現(xiàn)了,接下來我們測試一下。
測試
在瀏覽器中我們輸入以下 URL:
localhost:8080/test?judgePassword=happy&name=fdg
返回結(jié)果如下,可見對于添加了 @Judge 注解的接口,若 judgePassword 設(shè)置為 happy,攔截器會放行。

然后我們在瀏覽器輸入以下 URL:
http://localhost:8080/test?judgePassword=not&name=fdg
返回結(jié)果如下,可見對于添加了 @Judge 注解的接口,若 judgePassword 設(shè)置不為 happy,攔截器會拋出異常。

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/Geffin/article/details/108405165


??? ?
感謝點贊支持下哈?
