1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringSecurity之基本原理——過濾器加載過程

        共 14129字,需瀏覽 29分鐘

         ·

        2023-05-08 08:46

        點(diǎn)擊上方“藍(lán)字”,發(fā)現(xiàn)更多精彩。

        76775d4b472e87bda48bed07bd264d23.webp

        前一篇講解了S p r i n g S e c u r i t y的過濾器鏈的基本只是,今天我們就要進(jìn)入過濾器,看看其加載過程是如何的?


        相信認(rèn)真度過第一篇文章的小伙伴還記得,我說在S p r i n g B o o t出現(xiàn)后,幫助我們省去了那些繁瑣的配置,實(shí)現(xiàn)了自動(dòng)配置。那么,我們更應(yīng)該了解他是如何實(shí)現(xiàn)自動(dòng)加載的了!




        0 1 過濾器如何進(jìn)行加載

        要是用過濾器,就必須配置過濾器 DelegatingFilterProxy ,之所以我們?cè)谇懊娴氖纠袥]有進(jìn)行配置,是因?yàn)镾pring Boot 為我們完成了。

        具體的加載邏輯如下圖所示:

        b1076bbfa5ac169aa2638f32b0068b96.webp

        0 2 代碼實(shí)現(xiàn)

        首先進(jìn)入到DelegatingFilterProxy類中的d o F i l t e r中

                        
                          
                            
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        Filter delegateToUse = this.delegate;
        if (delegateToUse == null) {
        Object var5 = this.delegateMonitor;
        synchronized(this.delegateMonitor) {
        delegateToUse = this.delegate;
        if (delegateToUse == null) {
        WebApplicationContext wac = this.findWebApplicationContext();
        if (wac == null) {
        throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?");
        }


        delegateToUse = this.initDelegate(wac);
        }


        this.delegate = delegateToUse;
        }
        }


        this.invokeDelegate(delegateToUse, request, response, f i l t e r C h a i n);
        }


        執(zhí)行delegateToUse = this.initDelegate(wac);后進(jìn)入到F i l t e r C h a i n P r o x y 類中,


        List<Filter> filters = this.getFilters((HttpServletRequest)firewallRequest);加載所有的過濾器
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
        if (!clearContext) {
        this.doFilterInternal(request, response, chain);
        } else {
        try {
        request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
        this.doFilterInternal(request, response, chain);
        } catch (Exception var11) {
        Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(var11);
        Throwable requestRejectedException = this.throwableAnalyzer.getFirstThrowableOfType(RequestRejectedException.class, causeChain);
        if (!(requestRejectedException instanceof RequestRejectedException)) {
        throw var11;
        }


        this.requestRejectedHandler.handle((HttpServletRequest)request, (HttpServletResponse)response, (RequestRejectedException)requestRejectedException);
        } finally {
        SecurityContextHolder.clearContext();
        request.removeAttribute(FILTER_APPLIED);
        }


        }
        }


        private void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        FirewalledRequest firewallRequest = this.firewall.getFirewalledRequest((HttpServletRequest)request);
        HttpServletResponse firewallResponse = this.firewall.getFirewalledResponse((HttpServletResponse)response);
        List<Filter> filters = this.getFilters((HttpServletRequest)firewallRequest);
        if (filters != null && filters.size() != 0) {
        if (logger.isDebugEnabled()) {
        logger.debug(LogMessage.of(() -> {
        return "Securing " + requestLine(firewallRequest);
        }));
        }


        FilterChainProxy.VirtualFilterChain virtualFilterChain = new FilterChainProxy.VirtualFilterChain(firewallRequest, chain, filters);
        virtualFilterChain.doFilter(firewallRequest, firewallResponse);
        } else {
        if (logger.isTraceEnabled()) {
        logger.trace(LogMessage.of(() -> {
        return "No security for " + requestLine(firewallRequest);
        }));
        }


        firewallRequest.reset();
        chain.doFilter(firewallRequest, firewallResponse);
        }
        }


        往期 精彩 回顧



        開篇點(diǎn)睛——Elasticsearch 工欲善其事必先利其器——Elasticsearch安裝 如何將網(wǎng)站全部變成灰色的素裝效果,瞧過來 宇訊代碼生成器開源了 微信支付系列之——統(tǒng)一下單 springboot自動(dòng)裝配原理 如何優(yōu)雅的實(shí)現(xiàn)接口防刷 系統(tǒng)日志規(guī)范
        瀏覽 66
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操B五月天 | 忍一下疼初次h | 成人免费视频 网站在线看 | 久久免费看少妇 | 日韩欧美内射白浆 | 丝袜足交网 | 大鸡巴操逼视频网站 | 日本老女人性爱视频 | 国产呻吟高潮 | 黄频视频在线观看免费 |