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>

        Spring 中獲取 request 的幾種方法及其線程安全性分析

        共 3894字,需瀏覽 8分鐘

         ·

        2021-08-13 23:25

        點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)

        重磅干貨,第一時(shí)間送達(dá)

        0x01: 概述

        在使用Spring MVC開(kāi)發(fā)Web系統(tǒng)時(shí),經(jīng)常需要在處理請(qǐng)求時(shí)使用request對(duì)象,比如獲取客戶端ip地址、請(qǐng)求的url、header中的屬性(如cookie、授權(quán)信息)、body中的數(shù)據(jù)等。由于在Spring MVC中,處理請(qǐng)求的Controller、Service等對(duì)象都是單例的,因此獲取request對(duì)象時(shí)最需要注意的問(wèn)題,便是request對(duì)象是否是線程安全的:當(dāng)有大量并發(fā)請(qǐng)求時(shí),能否保證不同請(qǐng)求/線程中使用不同的request對(duì)象。

        這里還有一個(gè)問(wèn)題需要注意:前面所說(shuō)的“在處理請(qǐng)求時(shí)”使用request對(duì)象,究竟是在哪里使用呢?考慮到獲取request對(duì)象的方法有微小的不同,大體可以分為兩類:

        1) 在Spring的Bean中使用request對(duì)象:既包括Controller、Service、Repository等MVC的Bean,也包括了Component等普通的Spring Bean。為了方便說(shuō)明,后文中Spring中的Bean一律簡(jiǎn)稱為Bean。

        2) 在非Bean中使用request對(duì)象:如普通的Java對(duì)象的方法中使用,或在類的靜態(tài)方法中使用。

        此外,本文討論是圍繞代表請(qǐng)求的request對(duì)象展開(kāi)的,但所用方法同樣適用于response對(duì)象、InputStream/Reader、OutputStream/ Writer等;其中InputStream/Reader可以讀取請(qǐng)求中的數(shù)據(jù),OutputStream/ Writer可以向響應(yīng)寫入數(shù)據(jù)。

        0x02:Controller方法中加參數(shù)

        代碼示例

        這種方法實(shí)現(xiàn)最簡(jiǎn)單,直接上Controller代碼:

        @Controller
        public class TestController {
        @RequestMapping("/test")
        public void test(HttpServletRequest request) throws InterruptedException {
        // 模擬程序執(zhí)行了一段時(shí)間
        Thread.sleep(1000);
        }
        }

        該方法實(shí)現(xiàn)的原理是,在Controller方法開(kāi)始處理請(qǐng)求時(shí),Spring會(huì)將request對(duì)象賦值到方法參數(shù)中。除了request對(duì)象,可以通過(guò)這種方法獲取的參數(shù)還有很多,

        線程安全性

        測(cè)試結(jié)果:線程安全

        分析:此時(shí)request對(duì)象是方法參數(shù),相當(dāng)于局部變量,毫無(wú)疑問(wèn)是線程安全的。

        優(yōu)缺點(diǎn)

        這種方法的主要缺點(diǎn)是request對(duì)象寫起來(lái)冗余太多,主要體現(xiàn)在兩點(diǎn):

        1) 如果多個(gè)controller方法中都需要request對(duì)象,那么在每個(gè)方法中都需要添加一遍request參數(shù)

        2) request對(duì)象的獲取只能從controller開(kāi)始,如果使用request對(duì)象的地方在函數(shù)調(diào)用層級(jí)比較深的地方,那么整個(gè)調(diào)用鏈上的所有方法都需要添加request參數(shù)

        實(shí)際上,在整個(gè)請(qǐng)求處理的過(guò)程中,request對(duì)象是貫穿始終的;也就是說(shuō),除了定時(shí)器等特殊情況,request對(duì)象相當(dāng)于線程內(nèi)部的一個(gè)全局變量。而該方法,相當(dāng)于將這個(gè)全局變量,傳來(lái)傳去。

        0x03:自動(dòng)注入

        代碼示例

        @Controller
        public class TestController{

        @Autowired
        private HttpServletRequest request; //自動(dòng)注入request

        @RequestMapping("/test")
        public void test() throws InterruptedException{
        //模擬程序執(zhí)行了一段時(shí)間
        Thread.sleep(1000);
        }
        }

        線程安全性

        測(cè)試結(jié)果:線程安全

        分析:在Spring中,Controller的scope是singleton(單例),也就是說(shuō)在整個(gè)web系統(tǒng)中,只有一個(gè)TestController;但是其中注入的request卻是線程安全的,原因在于:使用這種方式,當(dāng)Bean(本例的TestController)初始化時(shí),Spring并沒(méi)有注入一個(gè)request對(duì)象,而是注入了一個(gè)代理(proxy);當(dāng)Bean中需要使用request對(duì)象時(shí),通過(guò)該代理獲取request對(duì)象。

        代理對(duì)象中用到了 ThreadLocal , 因此request對(duì)象也是線程局部變量;這就保證了request對(duì)象的線程安全性。

        優(yōu)缺點(diǎn)

        該方法的主要優(yōu)點(diǎn):

        1) 注入不局限于Controller中:在方法1中,只能在Controller中加入request參數(shù)。而對(duì)于方法2,不僅可以在Controller中注入,還可以在任何Bean中注入,包括Service、Repository及普通的Bean。

        2) 注入的對(duì)象不限于request:除了注入request對(duì)象,該方法還可以注入其他scope為request或session的對(duì)象,如response對(duì)象、session對(duì)象等;并保證線程安全。

        3) 減少代碼冗余:只需要在需要request對(duì)象的Bean中注入request對(duì)象,便可以在該Bean的各個(gè)方法中使用,與方法1相比大大減少了代碼冗余。

        但是,該方法也會(huì)存在代碼冗余??紤]這樣的場(chǎng)景:web系統(tǒng)中有很多controller,每個(gè)controller中都會(huì)使用request對(duì)象(這種場(chǎng)景實(shí)際上非常頻繁),這時(shí)就需要寫很多次注入request的代碼;如果還需要注入response,代碼就更繁瑣了。下面說(shuō)明自動(dòng)注入方法的改進(jìn)方法,并分析其線程安全性及優(yōu)缺點(diǎn)。

        0x04:基類中自動(dòng)注入

        代碼示例

        基類代碼:

        public class BaseController {
        @Autowired
        protected HttpServletRequest request;
        }

        線程安全性

        測(cè)試結(jié)果:線程安全

        分析:在理解了方法2的線程安全性的基礎(chǔ)上,很容易理解方法3是線程安全的:當(dāng)創(chuàng)建不同的派生類對(duì)象時(shí),基類中的域(這里是注入的request)在不同的派生類對(duì)象中會(huì)占據(jù)不同的內(nèi)存空間,也就是說(shuō)將注入request的代碼放在基類中對(duì)線程安全性沒(méi)有任何影響;測(cè)試結(jié)果也證明了這一點(diǎn)。

        優(yōu)缺點(diǎn)

        與方法2相比,避免了在不同的Controller中重復(fù)注入request;但是考慮到j(luò)ava只允許繼承一個(gè)基類,所以如果Controller需要繼承其他類時(shí),該方法便不再好用。

        無(wú)論是方法2和方法3,都只能在Bean中注入request;如果其他方法(如工具類中static方法)需要使用request對(duì)象,則需要在調(diào)用這些方法時(shí)將request參數(shù)傳遞進(jìn)去。下面介紹的方法4,則可以直接在諸如工具類中的static方法中使用request對(duì)象(當(dāng)然在各種Bean中也可以使用)。

        0x05:手動(dòng)調(diào)用

        代碼示例

        @Controller
        public class TestController {
        @RequestMapping("/test")
        public void test() throws InterruptedException {
        HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
        // 模擬程序執(zhí)行了一段時(shí)間
        Thread.sleep(1000);
        }
        }

        線程安全性

        測(cè)試結(jié)果:線程安全

        分析:該方法與方法2(自動(dòng)注入)類似,只不過(guò)方法2中通過(guò)自動(dòng)注入實(shí)現(xiàn),本方法通過(guò)手動(dòng)方法調(diào)用實(shí)現(xiàn)。因此本方法也是線程安全的。

        優(yōu)缺點(diǎn)

        優(yōu)點(diǎn):可以在非Bean中直接獲取。缺點(diǎn):如果使用的地方較多,代碼非常繁瑣;因此可以與其他方法配合使用。

        0x06:總結(jié)

        綜上所述,Controller中加參數(shù)(方法1)、自動(dòng)注入(方法2和方法3)、手動(dòng)調(diào)用(方法4)都是線程安全的,都可以用來(lái)獲取request對(duì)象。如果系統(tǒng)中request對(duì)象使用較少,則使用哪種方式均可;如果使用較多,建議使用自動(dòng)注入(方法2 和方法3)來(lái)減少代碼冗余。如果需要在非Bean中使用request對(duì)象,既可以在上層調(diào)用時(shí)通過(guò)參數(shù)傳入,也可以直接在方法中通過(guò)手動(dòng)調(diào)用(方法4)獲得。

        source:http://www.cnblogs.com/kismetv/p/8757260.html


        “拍一拍” 能撤回了 ?。?!

        5款Chrome插件,第1款絕對(duì)良心!

        為開(kāi)發(fā)色情游戲,這家公司赴日尋找AV女優(yōu)拍攝,期望暴力賺錢結(jié)果...

        拼多多終于釀成慘劇

        華為阿里下班時(shí)間曝光:所有的光鮮,都有加班的味道


        關(guān)


        ,學(xué),西學(xué)學(xué)運(yùn)營(yíng)護(hù)號(hào),樂(lè)質(zhì)結(jié)識(shí)關(guān)[],學(xué)習(xí)進(jìn)


        瀏覽 31
        點(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>
            国产777777| 精品视频第一页| 操逼视频免费播放| 足浴小少妇-88AX| 秋霞精品一区二区三区| 亚洲日韩精品欧美一区二区yw| 牛牛在线精品视频| 亚洲.欧美.丝袜.中文.综合| 亚洲AV高清| 国产69精品久久久久久久久久久久| 玖玖爱资源站| 日韩一区二区三区四区久久久精品有吗| 在线香蕉| 三级在线观看视频| 欧美人人操| 久久青青婷婷| 日本黄色片在线播放| 无码人妻丰满熟妇精品| HEZ-502搭讪绝品人妻系列| 97精品| 亚洲无码A片在线| 红桃91人妻爽人妻爽| 久热青草| 麻豆免费视频| 2019中文字幕在线| 99久久9| 91人妻人人爽人人澡人人爽| 亚洲免费在线视频观看| 蜜臀AⅤ在线| 久久久WWW成人免费无遮挡大片 | 丰满的人妻一区二区三区果冻| 翔田千里被操120分钟| www.插逼| 婷婷精品在线视频| 午夜福利毛片| 国产成人女人在线观看| 在线性视频| 中文字幕免费在线播放| 一级欧美一级日韩| www亚洲| 成年人黄色视频在线观看| 午夜福利毛片| 四虎影库男人天堂| 久久久久a| 综合色区| 亚洲无码一级电影| 屁屁影院CCYYCOM国产| AV片在线免费观看| 自拍偷拍网| 日韩成人不卡| 18禁网站禁片免费观看| 人人干人人摸| 精品日韩中文字幕| 91香蕉国产在线观看软件| 国产三级| 操老女人逼视频| 老熟女一区二区三区| 黑人粗暴偷拍一区二区| 大香蕉做爱视频| 中文字幕人妻互换av久久| 黄色视频在线免费观看高清视频| 四虎看片| 激情丁香| 中国免费视频高清观看| 影音先锋亚洲AV| 水蜜桃一曲二区| 444444在线观看免费高清电视剧木瓜一| 国产男女视频| 日本一级婬片A片AAA毛多多| 日韩视频免费在线| 伊人视频在线| 91麻豆大奶巨乳一区白虎| 欧美精品A片| h片在线观看免费| 大鸡吧操逼| 操逼福利视频| 国产在线小视频| 影音先锋91久久网| 成人特级毛片全部免费播放| 亚洲黄色视频免费| 国产学生妹| 黄色无码视频| 激情播播网| 女人一级A片色黄情免费| 亚洲国产av电影| 日韩高清在线播放| 免费一级片视频| 亚洲AV成人网| 天天操夜夜骑| 人妻精品综合码| 国产精品无码永久免费不卡| 亚欧美日韩| 国产无码在线看| 久久九九免费视频| 豆花视频成人版www满18| 亚洲第一区欧美日韩| 亚洲欧美影院| 日本一区二区三区在线观看| 日韩美女久久| 久久婷婷秘精品日产538| 亚洲色图欧美| 成人无码免费| 久久99久久99久久| 无码精品成人观看A片| 色男人的天堂| 五月丁香欧美综合| 婷婷日韩一区二区三区| 人人摸人人操人人爱| 婷婷色在线视频| 在线观看视频免费无码| 欧美口爆视频| 亚洲无码高清在线观看视频| 国产精品自拍三级| 日韩AV在线免费观看| 欧美性爱在线播放| 五月天中文字幕| 日韩成人不卡| 国产黄片免费观看| 色色网的五月天| 在线观看国产免费视频| 欧美日韩在线观看一区| 精品国产污污免费网站入口| 波多野结衣无码NET,AV| 国产精品色8| 中文字幕在线播放av| 国产TS丝袜人妖系列视频| 日韩成人不卡| 影音先锋一区二区三区| 一区二区三区在线观看免费| 欧美一级片| 四虎成人无码| 妖精视频黄色| 性满足BBWBBWBBW| 欧美精品在线观看| 亚洲天堂男人的天堂| 欧美午夜精品久久久| 亚洲成人无码一区| A片地址| 亚洲.无码.制服.日韩.中文字幕 | 日韩在线高清视频| 日本成人电影在线观看| 天堂8在线19| 五月开心激情网| 天天日AV| 日本高清无码| 日本中文在线观看| 自拍一区在线观看| 中文字幕在线观看免费高清电影| 嫩BBB搡BBBB搡BBBB-百度| 日本在线观看| 亚洲最大福利视频| 夜色福利在线看| 成人精品久久久| 日中国老太太B| 欧美亚洲色色网视频| 国产乱子伦视频国产印度| 亚洲国产一| 亚洲综合激情五月久久| 国产精品一区二区不卡| 91精品国产综合久久久蜜臀粉嫩| 日本一区免费| 国产一区二区三区四区五区六区七区 | 色欲狠狠躁天天躁无码中文字幕| 人人妻人人澡人人爽人人爽| 黄色视频日韩| 国产乱国产乱300精品| 亚洲精品国产精品国自产A片同性 丰满人妻一区二区三区四区不卡 国产1级a毛a毛1级a毛1级 | 干干日日| 蜜臀AV在线观看| 国产麻豆电影在线观看| 无码免费视频在线观看| 国内自拍视频网| 激情另类| 亚洲一二三四| 啪一啪操一操| 亚洲网站在线免费观看| 91无码人妻传媒tv| A片视频免费观看| 强伦人妻一区二区三区视频| 欧美黄色大香蕉| 天堂操逼| 午夜福利AV在线| 精品国产精品国产精品国产网站| 免费a片在线观看| 国产精品美女视频| 国产嫩草久久久一二三久久免费观看| 成人做爰100部免费网站| 成人综合在线观看| 懂色在线精品分类视频| 超碰99在线观看| 色欲五月天| 国产AV无码影院| 天天日天天干天天射| 青娱乐自拍偷拍| 欧美日韩字幕| 中文字幕视频在线免费观看| 色诱av| 国产传媒精品| 黄色片基地| 亚洲无码在线免费观看| 另类小说五月天| 在线观看视频亚洲| 波多野结衣福利视频| 最全av在线| 99人妻人人爽人人添人人精品| 囯产精品一区二区三区线一牛影视1| 欧美老熟妇BBBBB搡BBB| 伊人久久AV诱惑悠悠| 日韩无码久久久| 亚洲无码成人在线| 国产在线A片| 欧美成人精品激情在线观看| 99久久爱re热6在播放| 小骚逼操死你| 无码人妻精品一区二区三| 熟妇女人妻丰满少妇中文字幕| 无套内射在线| 亚洲少妇网| 日逼视频| 久久思思热| 国内自拍一区| 99久久精品国产一区二区成人 | 午夜看黄| 国产日韩欧美视频| 五月天精品| 免费黄色av网址| 欧一美一伦一A片| 黄色激情网站| 国产资源av| 五月在线视频| 四虎成人无码A片观看| 欧美MV日韩MV国产网站| 免费激情网站| 91新视频| 欧美一級黃色A片免費看| 国产精品午夜福利视频| 日本黄色视频免费| 精品啪啪| 日p视频在线观看| 小黃片秘嗯嗯啊| 中文字幕av高清片,中文在线观看| 精品福利在线| 亚洲天堂精品在线观看| 日本少妇网站| 中国无码视频| 日韩特一级| 刘玥精品国产一区二区三区| 猛男大粗猛爽h男人味| 日逼高清视频| 日韩黄色A片| 免费无码| 91麻豆国产在线观看| 久久性爱视频| 免费一级A片| 日逼视频免费观看| 网站你懂得| 翔田千里一区二区| 日本少妇高潮| 男女啪啪国产| 激情无码精品| 色播国产成人AV| 色婷婷综合视频| 97免费在线视频| 美国高清无码| 国产精品可站18| 在线观看免费完整版中文字幕视频 | 日本高清版色视频| 国产丝袜视频| 91人妻无码精品一区二区| www.亚洲精品| 另类毛片| 国产九九九九| 一区二区三区中文字幕| 性满足BBWBBWBBW| 国产色五月| 91人妻网| 狠狠躁夜夜躁人爽| 91人妻在线视频| 不卡免费视频| 人人妻人人爽人人精品| 超碰人人操人人爱| 激情五月丁香婷婷| 久久国产av| 精品中文字幕在线观看| 激情婷婷五月| 大香蕉A片| 日韩欧美视频| 中国熟女网站| 特黄AAAAAAAA片视频| 日本少妇黄色视频| 男人的天堂av网站| 少妇熟女视频一区二区三区| 国产午夜福利视频在线观看| 996精品在线| 综合久久视频| 淫香淫色天天影视| 色大香蕉伊人| 国产男女无套免费| 熟女人妻在线视频| 另类TS人妖一区二区三区|