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

SpringBoot統(tǒng)一功能處理示例詳解(攔截器)

 更新時(shí)間:2023年08月05日 16:09:59   作者:白楊783  
這篇文章主要介紹了SpringBoot統(tǒng)一功能處理(攔截器),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.用戶登錄權(quán)限校驗(yàn)

1.1自定義攔截器

寫(xiě)一個(gè)類去實(shí)現(xiàn)HandlerInterceptor接口表示當(dāng)前類是一個(gè)攔截器,再重寫(xiě)HandlerInterceptor接口中的方法,preHandle為在方法執(zhí)行前攔截,postHandle為方法執(zhí)行中攔截,afterCompletion為方法執(zhí)行中攔截.需要在什么時(shí)候攔截就重寫(xiě)什么方法

@Component
public class LoginIntercepetor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判斷用戶登錄
        HttpSession session = request.getSession(false);
        if(session!=null && session.getAttribute(ApplicationVariable.SESSION_USERINFO_KEY)!=null){
            // 用戶已經(jīng)登錄
            return true;
        }
        // 當(dāng)代碼執(zhí)行到此處說(shuō)明用戶未登錄
        response.sendRedirect("/login.html");
        return false;
    }
}

1.2.配置攔截規(guī)則

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") //攔截所有的URL
                .excludePathPatterns("/user/login") // 排除 url /user/login 不攔截
                .excludePathPatterns("/user/reg") // 排除 url /user/login 不攔截
        ;
    }
}

實(shí)現(xiàn)WebMvcConfigurer接口,重寫(xiě)WebMvcConfigurer中的addInterceptors方法,在使用 InterceptorRegistry參數(shù) 配置攔截規(guī)則

攔截器實(shí)現(xiàn)原理

統(tǒng)一異常處理

創(chuàng)建異常處理類

@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {
}

ControllerAdvice注解的作用:1.和Controller注解作用一樣,讓這個(gè)類隨著Spring的啟動(dòng)而啟動(dòng). 2.監(jiān)測(cè)添加了Controller注解的類的異常 

創(chuàng)建異常檢測(cè)的類和處理業(yè)務(wù)

@ExceptionHandler(NullPointerException.class)
public HashMap<String,Object> dpNullPointerException(NullPointerException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","空指針: "+e.getMessage());
        result.put("data",null);
        return result;
        }

使用@ExceptionHandler注解,括號(hào)里面寫(xiě)要捕獲的異常,用HashMap的方式返回?cái)?shù)據(jù)給前端,此處以捕獲空指針異常為例,如果想要捕獲所有的異常,可以使用所有異常的父類Exception

@ExceptionHandler(Exception.class)
    public HashMap<String,Object> doException(Exception e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","Exception: "+e.getMessage());
        result.put("data",null);
        return result;
    }

統(tǒng)一數(shù)據(jù)格式返回(在返回?cái)?shù)據(jù)之前進(jìn)行數(shù)據(jù)重寫(xiě))

@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {
    @Autowired
    ObjectMapper objectMapper;
    /**
     * 是否執(zhí)行 beforeBodyWrite 方法,true=執(zhí)行 重寫(xiě)返回結(jié)果,false=不執(zhí)行
     *
     * @param returnType
     * @param converterType
     * @return
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    /**
     * 在返回?cái)?shù)據(jù)之前進(jìn)行數(shù)據(jù)重寫(xiě)
     *
     * @param body     原始返回值
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //定義一個(gè)標(biāo)準(zhǔn)的返回格式
        //Hash<String,Object> code,msg,data
        if(body instanceof HashMap){
            return body;
        }
        // 重寫(xiě)返回結(jié)果,讓其返回一個(gè)統(tǒng)一的數(shù)據(jù)格式
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",200);
        result.put("msg","");
        result.put("data",body);
        if(body instanceof String){
            // 返回一個(gè) String 字符串
            try {
                objectMapper.writeValueAsString(result);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            return result;
        }
        return result;
    }
}

使用ResponseBodyAdvice接口,重寫(xiě)supports和beforeBodyWrite方法,這種方式如果原方法返回的是字符串,不進(jìn)行特殊處理會(huì)報(bào)錯(cuò)(執(zhí)行流程:

1.方法返回的是 String

2.統(tǒng)一數(shù)據(jù)返回之前處理 把String 轉(zhuǎn)換成 HashMap

3.將 HashMap 轉(zhuǎn)換成 application/json 字符串給前端(接口)),在第三步的時(shí)候會(huì)判斷原 body 類型,根據(jù)類型選擇不同的 消息轉(zhuǎn)換器 去轉(zhuǎn)換,如果是String 類型會(huì)使用StringHttpMessageConverter進(jìn)行類型轉(zhuǎn)換,如果非String 類型,會(huì)使用 HttpMessageConverter 進(jìn)行類型轉(zhuǎn)換.但是事實(shí)上StringHttpMessageConverter 消息轉(zhuǎn)換器不能把HashMap轉(zhuǎn)換為json格式的字符串,因此會(huì)報(bào)錯(cuò).   我們可以在統(tǒng)一數(shù)據(jù)重寫(xiě)時(shí),單獨(dú)處理String類型,讓其返回一個(gè) String 字符串,而非HashMap

到此這篇關(guān)于SpringBoot統(tǒng)一功能處理(攔截器)的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一功能處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項(xiàng)目中JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理的使用詳解

    SpringBoot項(xiàng)目中JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理的使用詳解

    JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理都是SpringBoot中實(shí)現(xiàn)AOP的重要技術(shù),JDK動(dòng)態(tài)代理通過(guò)反射生成代理類,適用于目標(biāo)類實(shí)現(xiàn)了接口的場(chǎng)景,性能較好,易用性高,但必須實(shí)現(xiàn)接口且不能代理final方法,CGLIB動(dòng)態(tài)代理通過(guò)生成子類實(shí)現(xiàn)代理
    2025-03-03
  • Java中的CAS鎖機(jī)制(無(wú)鎖、自旋鎖、樂(lè)觀鎖、輕量級(jí)鎖)詳解

    Java中的CAS鎖機(jī)制(無(wú)鎖、自旋鎖、樂(lè)觀鎖、輕量級(jí)鎖)詳解

    這篇文章主要介紹了Java中的CAS鎖機(jī)制(無(wú)鎖、自旋鎖、樂(lè)觀鎖、輕量級(jí)鎖)詳解,CAS算法的作用是解決多線程條件下使用鎖造成性能損耗問(wèn)題的算法,保證了原子性,這個(gè)原子操作是由CPU來(lái)完成的,需要的朋友可以參考下
    2024-01-01
  • Java實(shí)現(xiàn)雪花算法的工具類介紹

    Java實(shí)現(xiàn)雪花算法的工具類介紹

    雪花 (SnowFlake )算法是一種分布式唯一ID生成算法,可以生成全局唯一的ID標(biāo)識(shí)符,就像自然界中雪花一般沒(méi)有相同的雪花,本文和大家分享了一個(gè)雪花算法工具類,需要的可以收藏一下
    2023-05-05
  • RocketMQ存儲(chǔ)文件的實(shí)現(xiàn)

    RocketMQ存儲(chǔ)文件的實(shí)現(xiàn)

    這篇文章主要介紹了RocketMQ存儲(chǔ)文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法

    Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法

    這篇文章主要介紹了Spring Boot 與 kotlin 使用Thymeleaf模板引擎渲染web視圖的方法,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 解決報(bào)錯(cuò):java.lang.IllegalStateException: Failed to execute CommandLineRunner問(wèn)題

    解決報(bào)錯(cuò):java.lang.IllegalStateException: Failed to&nb

    在項(xiàng)目開(kāi)發(fā)中,可能會(huì)遇到Elasticsearch啟動(dòng)報(bào)錯(cuò)的問(wèn)題,原因可能包括版本不一致、端口配置錯(cuò)誤、配置文件不匹配及服務(wù)未啟動(dòng)等,解決方法包括檢查進(jìn)程、重啟服務(wù)等,這些經(jīng)驗(yàn)可以幫助開(kāi)發(fā)者快速定位問(wèn)題并解決,保證項(xiàng)目順利運(yùn)行
    2024-10-10
  • Java應(yīng)用CPU占用過(guò)高問(wèn)題的快速定位和解決方法

    Java應(yīng)用CPU占用過(guò)高問(wèn)題的快速定位和解決方法

    本文介紹了快速定位和解決Java應(yīng)用CPU占用過(guò)高問(wèn)題的標(biāo)準(zhǔn)流程,并通過(guò)一個(gè)實(shí)際案例演示,核心思想是通過(guò)進(jìn)程、線程、線程棧和源代碼的逐步排查,最終定位到問(wèn)題代碼,需要的朋友可以參考下
    2025-11-11
  • Java8 HashMap遍歷方式性能探討

    Java8 HashMap遍歷方式性能探討

    JDK8之前,可以使用keySet或者entrySet來(lái)遍歷HashMap,JDK8中引入了map.foreach來(lái)進(jìn)行遍歷
    2021-09-09
  • 如何解決hibernate一對(duì)多注解懶加載失效問(wèn)題

    如何解決hibernate一對(duì)多注解懶加載失效問(wèn)題

    這篇文章主要介紹了解決hibernate一對(duì)多注解懶加載失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java打印指定年月份的日歷

    java打印指定年月份的日歷

    這篇文章主要為大家詳細(xì)介紹了java打印指定年、指定月份的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07

最新評(píng)論

晋城| 城固县| 六盘水市| 武邑县| 大悟县| 裕民县| 宁化县| 鹿泉市| 建德市| 乌鲁木齐县| 鱼台县| 高雄县| 科技| 屯留县| 南皮县| 柘荣县| 富顺县| 临湘市| 石泉县| 崇仁县| 郸城县| 阜阳市| 合肥市| 常熟市| 陈巴尔虎旗| 沂源县| 宁强县| 金门县| 广河县| 黎平县| 安仁县| 淮阳县| 新河县| 肥城市| 康定县| 灌南县| 衡阳县| 瑞金市| 合阳县| 桐乡市| 兰州市|