最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Spring中如何獲取request的方法匯總及其線程安全性分析-創(chuàng)新互聯(lián)

前言

在貴池等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站制作,貴池網(wǎng)站建設(shè)費(fèi)用合理。

本文將介紹在Spring MVC開發(fā)的web系統(tǒng)中,獲取request對(duì)象的幾種方法,并討論其線程安全性。下面話不多說了,來一起看看詳細(xì)的介紹吧。

概述

在使用Spring MVC開發(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í)最需要注意的問題,便是request對(duì)象是否是線程安全的:當(dāng)有大量并發(fā)請(qǐng)求時(shí),能否保證不同請(qǐng)求/線程中使用不同的request對(duì)象。

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

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

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

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

最后,獲取request對(duì)象的方法與Spring及MVC的版本也有關(guān)系;本文基于Spring4進(jìn)行討論,且所做的實(shí)驗(yàn)都是使用4.1.1版本。

如何測(cè)試線程安全性

既然request對(duì)象的線程安全問題需要特別關(guān)注,為了便于后面的討論,下面先說明如何測(cè)試request對(duì)象是否是線程安全的。

測(cè)試的基本思路,是模擬客戶端大量并發(fā)請(qǐng)求,然后在服務(wù)器判斷這些請(qǐng)求是否使用了相同的request對(duì)象。

判斷request對(duì)象是否相同,最直觀的方式是打印出request對(duì)象的地址,如果相同則說明使用了相同的對(duì)象。然而,在幾乎所有web服務(wù)器的實(shí)現(xiàn)中,都使用了線程池,這樣就導(dǎo)致先后到達(dá)的兩個(gè)請(qǐng)求,可能由同一個(gè)線程處理:在前一個(gè)請(qǐng)求處理完成后,線程池收回該線程,并將該線程重新分配給了后面的請(qǐng)求。而在同一線程中,使用的request對(duì)象很可能是同一個(gè)(地址相同,屬性不同)。因此即便是對(duì)于線程安全的方法,不同的請(qǐng)求使用的request對(duì)象地址也可能相同。

為了避免這個(gè)問題,一種方法是在請(qǐng)求處理過程中使線程休眠幾秒,這樣可以讓每個(gè)線程工作的時(shí)間足夠長(zhǎng),從而避免同一個(gè)線程分配給不同的請(qǐng)求;另一種方法,是使用request的其他屬性(如參數(shù)、header、body等)作為request是否線程安全的依據(jù),因?yàn)榧幢悴煌恼?qǐng)求先后使用了同一個(gè)線程(request對(duì)象地址也相同),只要使用不同的屬性分別構(gòu)造了兩次request對(duì)象,那么request對(duì)象的使用就是線程安全的。本文使用第二種方法進(jìn)行測(cè)試。

客戶端測(cè)試代碼如下(創(chuàng)建1000個(gè)線程分別發(fā)送請(qǐng)求):

public class Test {
 public static void main(String[] args) throws Exception {
 String prefix = UUID.randomUUID().toString().replaceAll("-", "") + "::";
 for (int i = 0; i < 1000; i++) {
 final String value = prefix + i;
 new Thread() {
 @Override
 public void run() {
 try {
 CloseableHttpClient httpClient = HttpClients.createDefault();
 HttpGet httpGet = new HttpGet("http://localhost:8080/test?key=" + value);
 httpClient.execute(httpGet);
 httpClient.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }.start();
 }
 }
}

網(wǎng)站標(biāo)題:Spring中如何獲取request的方法匯總及其線程安全性分析-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://fisionsoft.com.cn/article/dhdeoi.html