最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot配置攔截器實(shí)現(xiàn)過(guò)程詳解

 更新時(shí)間:2022年10月21日 16:33:04   作者:大司空°  
在系統(tǒng)中經(jīng)常需要在處理用戶請(qǐng)求之前和之后執(zhí)行一些行為,例如檢測(cè)用戶的權(quán)限,或者將請(qǐng)求的信息記錄到日志中,即平時(shí)所說(shuō)的"權(quán)限檢測(cè)"及"日志記錄",下面這篇文章主要給大家介紹了關(guān)于在SpringBoot項(xiàng)目中整合攔截器的相關(guān)資料,需要的朋友可以參考下

如何配置攔截器

step1: 自定義攔截器

/**
 * 自定義攔截器
 */
public class MyInterceptor implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    /**
     * 在請(qǐng)求匹配controller之前執(zhí)行,返回true才行進(jìn)行下一步
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }
    /**
     * 已經(jīng)執(zhí)行完controller了,但是還沒(méi)有進(jìn)入視圖渲染
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    /**
     * 視圖也渲染完了,此時(shí)我可以做一些清理工作了
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

step2:配置攔截器

@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 攔截所有內(nèi)容:/** 攔截部分內(nèi)容:/admin/**
        super.addInterceptors(registry);
    }
}

攔截器設(shè)置容易出現(xiàn)的問(wèn)題

靜態(tài)資源被攔截

MyInterceptorConfig 繼承 WebMvcConfigurationSupport類時(shí),會(huì)導(dǎo)致resources/static下的靜態(tài)資源也被攔截,如果我們不想靜態(tài)資源被攔截,可以嘗試以下兩種方法。

/**
* 在MyInterceptorConfig中重寫addResourceHandlers方法,重新指定靜態(tài)資源
* 推薦在前后端分離時(shí)使用,后臺(tái)不需要訪問(wèn)靜態(tài)資源
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
   registry.addResourceHandler("/**").addResourceLocations(
           "classpath:/static/");
   super.addResourceHandlers(registry);
}
/**
 * 將MyInterceptorConfig類由繼承WebMvcConfigurationSupport改為實(shí)現(xiàn)WebMvcConfigurer
 * 推薦在非前后端分離時(shí)使用,后臺(tái)需要訪問(wèn)靜態(tài)資源
 *
 */
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 攔截所有內(nèi)容:/** 攔截部分內(nèi)容:/admin/**
    }
}

如何取消攔截操作

step1:自定義注解

/**
 * 自定義注解用來(lái)指定某個(gè)方法不用攔截
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UnInterception {
}

step2:修改攔截器MyInterceptor中的preHandle方法

/**
 * 在請(qǐng)求匹配controller之前執(zhí)行
 * @param request
 * @param response
 * @param handler
 * @return
 * @throws Exception
 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    UnInterception unInterception = method.getAnnotation(UnInterception.class);
    if(null != unInterception) {
        logger.info("不需要攔截,可以執(zhí)行");
        return true;
    }
    // 返回true才會(huì)執(zhí)行方法,返回false不會(huì)執(zhí)行
    return false;
}

step3:在不需要攔截的controller上加上UnInterception注解

@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
    @UnInterception
    @RequestMapping("/test")
    public String test() {
        return "hello";
    }
}

實(shí)例-登錄驗(yàn)證

用攔截器實(shí)現(xiàn)一個(gè)登錄驗(yàn)證功能

step1:自定義攔截器

import com.kimmel.course13.annotation.UnInterception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
import java.lang.reflect.Method;
/**
 * 自定義攔截器
 */
public class MyInterceptor implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    /**
     * 在請(qǐng)求匹配controller之前執(zhí)行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        // 判斷用戶有沒(méi)有登錄,一般登錄之后的用戶都有一個(gè)對(duì)應(yīng)的token
        UnInterception unInterception = method.getAnnotation(UnInterception.class);
        String token = request.getParameter("token");
        if (null == token || "".equals(token)) {
            logger.info("用戶未登錄,沒(méi)有權(quán)限執(zhí)行{}請(qǐng)登錄", methodName);
            return false;
        }
        // 返回true才會(huì)執(zhí)行方法,返回false不會(huì)執(zhí)行
        return true;
    }
    /**
     * 已經(jīng)執(zhí)行完controller了,但是還沒(méi)有進(jìn)入視圖渲染
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        String methodName = method.getName();
        logger.info("已經(jīng)執(zhí)行完{}了,但是還沒(méi)有進(jìn)入視圖渲染", methodName);
    }
    /**
     * 視圖也渲染完了,此時(shí)我可以做一些清理工作了
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("視圖也渲染完了,此時(shí)我可以做一些清理工作了");
    }
}

step2:配置攔截器

import com.kimmel.course13.Interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 攔截所有內(nèi)容:/** 攔截部分內(nèi)容:/admin/**
        super.addInterceptors(registry);
    }
    /**
     * 發(fā)現(xiàn)如果繼承了WebMvcConfigurationSupport,則在yml中配置的相關(guān)內(nèi)容會(huì)失效。 需要重新指定靜態(tài)資源
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations(
                "classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
                "classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
        super.addResourceHandlers(registry);
    }
}

step3:自定義測(cè)試controller

@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
    @RequestMapping("/test")
    public String test() {
        return "hello";
    }
}

step4:測(cè)試

進(jìn)入瀏覽器,輸入http://localhost:8080/interceptor/test
結(jié)果:無(wú)法進(jìn)入,日志:用戶未登錄,沒(méi)有權(quán)限執(zhí)行 test 請(qǐng)登錄
進(jìn)入瀏覽器,輸入http://localhost:8080/interceptor/test?token=1
結(jié)果:成功進(jìn)入hello.html

到此這篇關(guān)于SpringBoot配置攔截器實(shí)現(xiàn)過(guò)程詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情

    java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情

    這篇文章主要介紹了java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • java中1+1d/5和1+1/5的區(qū)別說(shuō)明

    java中1+1d/5和1+1/5的區(qū)別說(shuō)明

    這篇文章主要介紹了java中1+1d/5和1+1/5的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法

    Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法

    這篇文章主要給大家介紹了關(guān)于Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法,MySQL是一款常用的關(guān)系型數(shù)據(jù)庫(kù),它的JDBC驅(qū)動(dòng)程序使得我們可以通過(guò)Java程序連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)

    Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)

    本文是一個(gè)Java語(yǔ)言編寫的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)醫(yī)院預(yù)約掛號(hào)系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧
    2021-09-09
  • Java貪心算法超詳細(xì)講解

    Java貪心算法超詳細(xì)講解

    人之初性本善,但是隨著自身的經(jīng)歷、生活環(huán)境等因素的影響,人逐漸會(huì)生出貪嗔癡。實(shí)際上不光人有貪念,我們的算法也會(huì)有貪念,今天就和大家介紹下一個(gè)有貪念的算法模型---貪心算法,看看一個(gè)算法是怎么產(chǎn)生貪念的
    2022-05-05
  • 將SpringBoot項(xiàng)目無(wú)縫部署到Tomcat服務(wù)器的操作流程

    將SpringBoot項(xiàng)目無(wú)縫部署到Tomcat服務(wù)器的操作流程

    SpringBoot 是一個(gè)用來(lái)簡(jiǎn)化 Spring 應(yīng)用初始搭建以及開(kāi)發(fā)過(guò)程的框架,我們可以通過(guò)內(nèi)置的 Tomcat 容器來(lái)輕松地運(yùn)行我們的應(yīng)用,本文給大家介紹 SpringBoot 項(xiàng)目部署到獨(dú)立 Tomcat 服務(wù)器的操作流程,需要的朋友可以參考下
    2024-05-05
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):緒論

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):緒論

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07
  • Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版

    Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Mybatis實(shí)現(xiàn)ResultMap結(jié)果集

    Mybatis實(shí)現(xiàn)ResultMap結(jié)果集

    本文主要介紹了Mybatis實(shí)現(xiàn)ResultMap結(jié)果集,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • JDBC三層架構(gòu)深入刨析

    JDBC三層架構(gòu)深入刨析

    三層架構(gòu)是一種軟件設(shè)計(jì)架構(gòu),是一種組織代碼的手段和方法,三層架構(gòu)的優(yōu)點(diǎn)是擴(kuò)展性好,復(fù)用性高;缺點(diǎn)是步驟多,比較繁瑣;代碼多,效率降低
    2022-12-12

最新評(píng)論

安吉县| 宾川县| 松桃| 赤水市| 澄迈县| 肥东县| 德安县| 防城港市| 孝义市| 神池县| 景德镇市| 广河县| 临漳县| 睢宁县| 即墨市| 永年县| 郸城县| 始兴县| 牡丹江市| 玉树县| 富川| 城市| 曲松县| 隆德县| 永善县| 金华市| 平湖市| 绍兴市| 红原县| 荆门市| 巴楚县| 富裕县| 南康市| 石棉县| 江达县| 沙田区| 平顺县| 鸡东县| 辽宁省| 岳阳市| 牙克石市|