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

Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉

 更新時間:2022年08月05日 10:42:38   作者:共飲一杯無  
本文主要介紹了Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

線程封閉

線程封閉一般通過以下三個方法:

  • Ad-hoc線程封閉:程序控制實現(xiàn),最糟糕,忽略
  • 堆棧封閉:局部變量,無并發(fā)問題
  • ThreadLocal線程封閉:特別好的封閉方法

方法2是最常用的,變量定義在接口內(nèi),本文主要講解方法三,SpringBoot項目通過自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉。實現(xiàn)Filter接口自定義過濾器和繼承HandlerInterceptorAdapter自定義攔截器。

ThreadLocal線程封閉實現(xiàn)步驟

封裝ThredLocal的方法

/**
 * <p>自定義RequestHolder</p></p>
 *
 * @Author zjq
 * @Date 2021/12
 */
public class RequestHolder {

    private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();

    public static void set(Long id) {
        requestHolder.set(id);
    }

    public static Long get() {
        return requestHolder.get();
    }

    public static void remove() {
        requestHolder.remove();
    }

}

自定義過濾器

自定義定義攔截器繼承Filter接口,實現(xiàn)ThredLocal.add()方法

/**
 * <p>自定義過濾器</p>
 *
 * @Author zjq
 * @Date 2021/12/7
 */
@Slf4j
public class HttpFilter implements Filter {

    /**
     * 為Filter初始化 提供支持
     *
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 攔截到要執(zhí)行的請求時,doFilter就會執(zhí)行。這里我們可以寫對請求和響應(yīng)的預(yù)處理。
     * FilterChain把請求和響應(yīng)傳遞給下一個 Filter處理
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //把普通servlet強轉(zhuǎn)成httpServlet
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        Long threadId = Thread.currentThread().getId();
        log.info("do filter,threadId:{} servletPath:{}", threadId, httpServletRequest.getServletPath());
        //把當前線程id放入requestHolder
        RequestHolder.set(threadId);
        //放行
        filterChain.doFilter(httpServletRequest, servletResponse);
    }

    /**
     * Filter 實例銷毀前的準備工作
     */
    @Override
    public void destroy() {

    }
}

自定義攔截器

自定義攔截器在線程使用完畢后移除ThredLocal中內(nèi)容,避免內(nèi)存溢出

/**
 * <p>自定義攔截器</p>
 *
 * @Author zjq
 * @Date 2021/12/7
 */
@Slf4j
public class HttpInterceptor extends HandlerInterceptorAdapter {

    /**
     * 攔截處理程序的執(zhí)行。在 HandlerMapping 確定合適的處理程序?qū)ο笾?,?HandlerAdapter 調(diào)用處理程序之前調(diào)用。
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle執(zhí)行。。。");
        return true;
    }

    /**
     * 請求處理完成后(渲染視圖后)的回調(diào)。將在處理程序執(zhí)行的任何結(jié)果上調(diào)用,從而允許進行適當?shù)馁Y源清理。
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        RequestHolder.remove();
        log.info("afterCompletion執(zhí)行。。。");
        return;
    }
}

Application類啟動類中配置自定義過濾器和攔截器

/**
 * 
 * @author zjq
 */
@SpringBootApplication
public class Application extends WebMvcConfigurationSupport {

    public static void main(String[] args) {
        SpringApplication.run(ConcurrencyApplication.class, args);
    }

    /**
     * 自定義過濾器
     * @return
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new HttpFilter());
        //設(shè)置自定義過濾器攔截的url
        filterRegistrationBean.addUrlPatterns("/threadLocal/*");
        return filterRegistrationBean;
    }

    /**
     * 定義自定義攔截器原先需要繼承WebMvcConfigurerAdapter
     * SpringBoot2.0后WebMvcConfigurerAdapter被定義成過時了,推薦使用繼承WebMvcConfigurationSupport
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HttpInterceptor()).addPathPatterns("/**");
    }
}

定義調(diào)用接口

/**
 * ThreadLocal測試controller
 * @author zjq
 */
@Controller
@RequestMapping("/threadLocal")
public class ThreadLocalController {

    @RequestMapping("/test")
    @ResponseBody
    public Long test() {
        return RequestHolder.get();
    }
}

請求訪問驗證

訪問調(diào)用接口http://localhost:8080/threadLocal/test,控制臺輸出如下:

到此這篇關(guān)于Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉的文章就介紹到這了,更多相關(guān)Java ThreadLocal線程封閉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成PDFBox實現(xiàn)電子簽章的代碼詳解

    SpringBoot集成PDFBox實現(xiàn)電子簽章的代碼詳解

    Apache PDFBox 是一個開源的 Java 庫,用于處理 PDF 文檔,它提供了一系列強大的功能,包括創(chuàng)建、渲染、拆分、合并、加密、解密 PDF 文件,以及從 PDF 中提取文本和元數(shù)據(jù)等,本文給大家介紹了SpringBoot集成PDFBox實現(xiàn)電子簽章,需要的朋友可以參考下
    2024-09-09
  • JavaEE多線程中阻塞隊列的項目實踐

    JavaEE多線程中阻塞隊列的項目實踐

    本文主要介紹了JavaEE多線程中阻塞隊列的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • Java設(shè)計模式之java模板方法模式詳解

    Java設(shè)計模式之java模板方法模式詳解

    這篇文章主要介紹了Java設(shè)計模式模板方法模式(Template)用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-09-09
  • ConditionalOnProperty配置swagger不生效問題及解決

    ConditionalOnProperty配置swagger不生效問題及解決

    這篇文章主要介紹了ConditionalOnProperty配置swagger不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Mybatis mapper接口動態(tài)代理開發(fā)步驟解析

    Mybatis mapper接口動態(tài)代理開發(fā)步驟解析

    這篇文章主要介紹了Mybatis mapper接口動態(tài)代理開發(fā)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Java之MultipartFile和File類型互轉(zhuǎn)方式

    Java之MultipartFile和File類型互轉(zhuǎn)方式

    這篇文章主要介紹了Java之MultipartFile和File類型互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • springboot調(diào)用HTML文件注意事項及說明

    springboot調(diào)用HTML文件注意事項及說明

    這篇文章主要介紹了springboot調(diào)用HTML文件注意事項及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決MybatisPlus批量插入數(shù)據(jù)報錯:Error getting generated key or setting result to parameter object問題

    解決MybatisPlus批量插入數(shù)據(jù)報錯:Error getting generated 

    在使用MybatisPlus進行批量插入數(shù)據(jù)時遇到空指針異常錯誤,分析原因是由于主鍵生成策略導(dǎo)致的,嘗試通過設(shè)置useGeneratedKeys屬性解決問題,但因批量插入方法限制,該方法未能成功,最終通過自定義mapper方法實現(xiàn)批量插入,解決了問題
    2024-09-09
  • java開發(fā)BeanUtils類解決實體對象間賦值

    java開發(fā)BeanUtils類解決實體對象間賦值

    這篇文章主要為大家介紹了java開發(fā)中使用BeanUtils類實現(xiàn)實體對象之間的賦值有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步學有所得
    2021-10-10
  • 從零開始Mybatis連接數(shù)據(jù)庫的方法

    從零開始Mybatis連接數(shù)據(jù)庫的方法

    這篇文章主要介紹了Mybatis連接數(shù)據(jù)庫的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02

最新評論

克什克腾旗| 高州市| 平舆县| 尖扎县| 潜江市| 溧水县| 和政县| 鄂托克旗| 获嘉县| 靖江市| 云和县| 钦州市| 大连市| 峨边| 元氏县| 邢台县| 中宁县| 河间市| 马公市| 寿阳县| 宝清县| 冀州市| 霸州市| 唐河县| 当阳市| 邹城市| 微山县| 和静县| 泾阳县| 会同县| 靖安县| 滨海县| 罗甸县| 烟台市| 青河县| 沅江市| 凌海市| 邮箱| 广汉市| 甘德县| 昌黎县|