SpringBoot攔截器


攔截器的實現類

​ 在編寫一個攔截器的類的時候需要實現HandlerInterceptor接口

HandlerInterceptor接口方法如下:

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
  • preHandler:業務處理器處理請求之前被調用,對用戶的request進行處理,若返回值為true,則繼續調用后續的攔截器和目標方法;若返回值為false,則終止請求;這里可以加上登錄校驗,權限攔截等。
  • postHandler:Controller執行后但未返回視圖前調用該方法,這里可以對返回用戶前的模型數據進行加工處理。
  • afterCompletion:Controller執行后且返回視圖后調用,可以得到Controller時的異常信息,這里可以記錄操作日志,資源清理等。

實現注冊攔截

這里我是重寫的preHandler方法,用來登錄攔截的。具體代碼實現如下

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲取request作用域中的token
        String token = request.getHeader("token");
        if (token == null) {
            token = request.getParameter("token");
        }
        if (token != null) {
            //解密token
            Claims claims = JwtUtils.checkJWT(token);
            if (claims != null) {
                //獲取解密后的信息
                Integer userId = (Integer) claims.get("id");
                String name = (String) claims.get("name");
                request.setAttribute("user_id",userId);
                request.setAttribute("name",name);
                return true;
            }
        }
        return false;
    }

在這,返回的無非就是一個true或false,所以中間我寫的是我的業務邏輯代碼,也就是通過獲取token來判斷用戶是否登錄,若未登錄,則返回false,終止該請求。

將攔截器加入到MVC中

在SpringBoot 2.0以上, WebMvcConfigurerAdapter已過時,但是WebMvcConfigurerAdapter實際上是WebMvcConfigurer接口的空實現類。故有兩種方法可以實現:推薦使用:implements WebMvcConfigurer

方法有如下幾種:

1. @EnableWebMvc + implements WebMvcConfigurer
在擴展類中重寫父類的方法即可,這種方法會屏蔽springboot對SpringMVC的自動配置。
2. implements WebMvcConfigurer
在擴展類中重寫父類的方法即可,這種方法會使用springboot對SpringMVC的自動配置。
3. extends WebMvcConfigurationSupport
在擴展類中重寫父類的方法即可,這種方法會屏蔽springboot對SpringMVC的自動配置。

接下來就是需要將攔截器加入到MVC中,也就是配置剛剛創建的攔截器,我們創建一個類,加上@Configuration這個注解並且實現WebMvcConfigurer這個接口

然后重寫addInterceptors這個方法把我們剛剛創建的攔截器配置好路徑后添加到MVC中即可。

具體實現如下:

@Configuration
public class IntercepterConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注冊攔截器 並配置攔截路徑
        registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/user/api/v1/*/**");
        //添加攔截器
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM