真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Spring中如何獲取request的方法匯總及其線程安全性分析-創(chuàng)新互聯(lián)

前言

在貴池等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(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)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站制作,貴池網(wǎng)站建設(shè)費(fèi)用合理。

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

概述

在使用Spring MVC開(kāi)發(fā)Web系統(tǒng)時(shí),經(jīng)常需要在處理請(qǐng)求時(shí)使用request對(duì)象,比如獲取客戶(hù)端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ì)象的方法有微小的不同,大體可以分為兩類(lèi):

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

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

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

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

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

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

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

判斷request對(duì)象是否相同,最直觀的方式是打印出request對(duì)象的地址,如果相同則說(shuō)明使用了相同的對(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è)問(wèn)題,一種方法是在請(qǐng)求處理過(guò)程中使線程休眠幾秒,這樣可以讓每個(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è)試。

客戶(hù)端測(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();
 }
 }
}

本文題目:Spring中如何獲取request的方法匯總及其線程安全性分析-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/dhdeoi.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部