偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

所有和Java中代理有關(guān)的知識(shí)點(diǎn)都在這了

開發(fā) 開發(fā)工具
對(duì)于每一個(gè)Java開發(fā)來說,代理這個(gè)詞或多或少都會(huì)聽說過。你可能聽到過的有代理模式、動(dòng)態(tài)代理、反向代理等。那么,到底什么是代理,這么多代理又有什么區(qū)別呢。本文就來簡要分析一下。

對(duì)于每一個(gè)Java開發(fā)來說,代理這個(gè)詞或多或少都會(huì)聽說過。你可能聽到過的有代理模式、動(dòng)態(tài)代理、反向代理等。那么,到底什么是代理,這么多代理又有什么區(qū)別呢。本文就來簡要分析一下。

代理技術(shù),其實(shí)不只是Java語言特有的技術(shù),其實(shí)在互聯(lián)網(wǎng)早期就已經(jīng)出現(xiàn)了這種技術(shù)。

在計(jì)算機(jī)網(wǎng)絡(luò)層面,常用的代理技術(shù)有:正向代理、反向代理和透明代理。最常用到的就是正向代理和反向代理。

正向代理和反向代理

正向代理

正向代理(forward proxy):是一個(gè)位于客戶端和目標(biāo)服務(wù)器之間的服務(wù)器(代理服務(wù)器),為了從目標(biāo)服務(wù)器取得內(nèi)容,客戶端向代理服務(wù)器發(fā)送一個(gè)請(qǐng)求并指定目標(biāo),然后代理服務(wù)器向目標(biāo)服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端??蛻舳吮仨氁M(jìn)行一些特別的配置才能使用正向代理。一般情況下,如果沒有特別說明,代理技術(shù)默認(rèn)是指正向代理技術(shù)。

這種代理其實(shí)在生活中是比較常見的,比如科學(xué)上網(wǎng)技術(shù),其用到的就是代理技術(shù)。

小明想要訪問某國外網(wǎng)站,該網(wǎng)站無法在國內(nèi)直接訪問,但是小明可以訪問到一個(gè)代理服務(wù)器,這個(gè)代理服務(wù)器可以訪問到這個(gè)國外網(wǎng)站。這樣呢,小明對(duì)該國外網(wǎng)站的訪問就需要通過代理服務(wù)器來轉(zhuǎn)發(fā)請(qǐng)求,并且該代理服務(wù)器也會(huì)將請(qǐng)求的響應(yīng)再返回給小明。這個(gè)上網(wǎng)的過程就是用到了正向代理。

在通過正向代理服務(wù)器的時(shí)候,目標(biāo)服務(wù)器是不知道真正的客戶端是誰的,只知道是代理服務(wù)器在發(fā)送請(qǐng)求。

正向代理的用途

突破訪問限制:通過代理服務(wù)器,可以突破自身IP訪問限制,訪問國外網(wǎng)站,教育網(wǎng)等。

最近一些年,隨著VPN技術(shù)的不斷發(fā)展,一般的突破訪問限制都是通過VPN來實(shí)現(xiàn)的,如果你仔細(xì)了解一下VPN的話,你會(huì)發(fā)現(xiàn),其實(shí)VPN也是正向代理的一種實(shí)現(xiàn),其本質(zhì)上也是一個(gè)代理服務(wù)器。

提高訪問速度:通常代理服務(wù)器都設(shè)置一個(gè)較大的硬盤緩沖區(qū),會(huì)將部分請(qǐng)求的響應(yīng)保存到緩沖區(qū)中,當(dāng)其他用戶再訪問相同的信息時(shí), 則直接由緩沖區(qū)中取出信息,傳給用戶,以提高訪問速度。

隱藏客戶端真實(shí)IP:上網(wǎng)者也可以通過這種方法隱藏自己的IP,免受攻擊。

反向代理

反向代理(reverse proxy):是指以代理服務(wù)器來接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)反向代理服務(wù)器。

對(duì)于常用的場景,就是我們?cè)赪eb開發(fā)中用到的負(fù)載均衡服務(wù)器,客戶端發(fā)送請(qǐng)求到負(fù)載均衡服務(wù)器上,負(fù)載均衡服務(wù)器再把請(qǐng)求轉(zhuǎn)發(fā)給一臺(tái)真正的服務(wù)器來執(zhí)行,再把執(zhí)行結(jié)果返回給客戶端。

前面我們說過,通過正向代理服務(wù)器訪問目標(biāo)服務(wù)器,目標(biāo)服務(wù)器是不知道真正的客戶端是誰的,甚至不知道訪問自己的是一個(gè)代理。而通過反向代理服務(wù)器訪問目標(biāo)服務(wù)器時(shí),客戶端是不知道真正的目標(biāo)服務(wù)器是誰的,甚至不知道自己訪問的是一個(gè)代理。這也是正向代理和反向代理的區(qū)別。

反向代理的用途

隱藏服務(wù)器真實(shí)IP:使用反向代理,可以對(duì)客戶端隱藏服務(wù)器的IP地址。

負(fù)載均衡:反向代理服務(wù)器可以做負(fù)載均衡,根據(jù)所有真實(shí)服務(wù)器的負(fù)載情況,將客戶端請(qǐng)求分發(fā)到不同的真實(shí)服務(wù)器上。

提高訪問速度:反向代理服務(wù)器可以對(duì)于靜態(tài)內(nèi)容及短時(shí)間內(nèi)有大量訪問請(qǐng)求的動(dòng)態(tài)內(nèi)容提供緩存服務(wù),提高訪問速度。

提供安全保障:反向代理服務(wù)器可以作為應(yīng)用層防火墻,為網(wǎng)站提供對(duì)基于Web的攻擊行為(例如DoS/DDoS)的防護(hù),更容易排查惡意軟件等。還可以為后端服務(wù)器統(tǒng)一提供加密和SSL加速(如SSL終端代理),提供HTTP訪問認(rèn)證等。

靜態(tài)代理和動(dòng)態(tài)代理

前面介紹的是計(jì)算機(jī)網(wǎng)絡(luò)層的代理機(jī)制,一般指的是服務(wù)請(qǐng)求的代理。在Java的日常開發(fā)中還會(huì)接觸到另外一種代理,或者說叫做代理模式。

在某些情況下,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象,此時(shí)可以通過一個(gè)稱之為“代理”的第三者來實(shí)現(xiàn)間接引用。代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,并且可以通過代理對(duì)象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)。

通過引入一個(gè)新的對(duì)象來實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象作為真實(shí)對(duì)象的一個(gè)替身,這種實(shí)現(xiàn)機(jī)制即為代理模式,通過引入代理對(duì)象來間接訪問一個(gè)對(duì)象,這就是代理模式的模式動(dòng)機(jī)。

代理模式(Proxy Pattern) :給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。

按照代理類的創(chuàng)建時(shí)期,代理類可分為兩種,即動(dòng)態(tài)代理類和靜態(tài)代理類。就是我們經(jīng)常提到的靜態(tài)代理和動(dòng)態(tài)代理中主要用到的類。

所以,靜態(tài)代理和動(dòng)態(tài)代理的主要區(qū)別就是代理類創(chuàng)建的時(shí)間不同。

靜態(tài)代理類:由程序員創(chuàng)建或由特定工具自動(dòng)生成源代碼,再對(duì)其編譯。在程序運(yùn)行前,代理類的.class文件就已經(jīng)存在了。

動(dòng)態(tài)代理類:在程序運(yùn)行時(shí),運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。

靜態(tài)代理通常只代理一個(gè)類,動(dòng)態(tài)代理是代理一個(gè)接口下的多個(gè)實(shí)現(xiàn)類。靜態(tài)代理事先知道要代理的是什么,而動(dòng)態(tài)代理不知道要代理什么東西,只有在運(yùn)行時(shí)才知道。

Java中的靜態(tài)代理

所謂靜態(tài)代理,就是代理類是由程序員自己編寫的,在編譯期就確定好了的。來看下下面的例子:

  1. public interface HelloSerivice { 
  2.     public void say(); 
  3.  
  4. public class HelloSeriviceImpl implements HelloSerivice{ 
  5.  
  6.     @Override 
  7.     public void say() { 
  8.         System.out.println("hello world"); 
  9.     } 

上面的代碼比較簡單,定義了一個(gè)接口和其實(shí)現(xiàn)類。這就是代理模式中的目標(biāo)對(duì)象和目標(biāo)對(duì)象的接口。接下類定義代理對(duì)象。

  1. public class HelloSeriviceProxy implements HelloSerivice{ 
  2.  
  3.     private HelloSerivice target; 
  4.     public HelloSeriviceProxy(HelloSerivice target) { 
  5.         this.target = target; 
  6.     } 
  7.  
  8.     @Override 
  9.     public void say() { 
  10.         System.out.println("記錄日志"); 
  11.         target.say(); 
  12.         System.out.println("清理數(shù)據(jù)"); 
  13.     } 

上面就是一個(gè)代理類,他也實(shí)現(xiàn)了目標(biāo)對(duì)象的接口,并且擴(kuò)展了say方法。下面是一個(gè)測試類:

  1. public class Main { 
  2.     @Test 
  3.     public void testProxy(){ 
  4.         //目標(biāo)對(duì)象 
  5.         HelloSerivice target = new HelloSeriviceImpl(); 
  6.         //代理對(duì)象 
  7.         HelloSeriviceProxy proxy = new HelloSeriviceProxy(target); 
  8.         proxy.say(); 
  9.     } 
  10.  
  11. // 記錄日志 
  12. // hello world 
  13. // 清理數(shù)據(jù) 

這就是一個(gè)簡單的靜態(tài)的代理模式的實(shí)現(xiàn)。代理模式中的所有角色(代理對(duì)象、目標(biāo)對(duì)象、目標(biāo)對(duì)象的接口)等都是在編譯期就確定好的。

靜態(tài)代理的用途

控制真實(shí)對(duì)象的訪問權(quán)限:通過代理對(duì)象控制對(duì)真實(shí)對(duì)象的使用權(quán)限。

避免創(chuàng)建大對(duì)象:通過使用一個(gè)代理小對(duì)象來代表一個(gè)真實(shí)的大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。

增強(qiáng)真實(shí)對(duì)象的功能:這個(gè)比較簡單,通過代理可以在調(diào)用真實(shí)對(duì)象的方法的前后增加額外功能。

Java中的動(dòng)態(tài)代理

前面介紹了靜態(tài)代理,雖然靜態(tài)代理模式很好用,但是靜態(tài)代理還是存在一些局限性的,比如使用靜態(tài)代理模式需要程序員手寫很多代碼,這個(gè)過程是比較浪費(fèi)時(shí)間和精力的。一旦需要代理的類中方法比較多,或者需要同時(shí)代理多個(gè)對(duì)象的時(shí)候,這無疑會(huì)增加很大的復(fù)雜度。

有沒有一種方法,可以不需要程序員自己手寫代理類呢。這就是動(dòng)態(tài)代理啦。

動(dòng)態(tài)代理中的代理類并不要求在編譯期就確定,而是可以在運(yùn)行期動(dòng)態(tài)生成,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的代理功能。

Java中,實(shí)現(xiàn)動(dòng)態(tài)代理有兩種方式:

JDK動(dòng)態(tài)代理:java.lang.reflect 包中的Proxy類和InvocationHandler接口提供了生成動(dòng)態(tài)代理類的能力。

Cglib動(dòng)態(tài)代理:Cglib (Code Generation Library )是一個(gè)第三方代碼生成類庫,運(yùn)行時(shí)在內(nèi)存中動(dòng)態(tài)生成一個(gè)子類對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能的擴(kuò)展。

關(guān)于這兩種動(dòng)態(tài)代理的寫法本文就不深入展開了,讀者感興趣的話,后面我再寫文章單獨(dú)介紹。本文主要來簡單說一下這兩種動(dòng)態(tài)代理的區(qū)別和用途。

JDK動(dòng)態(tài)代理和Cglib動(dòng)態(tài)代理的區(qū)別

JDK的動(dòng)態(tài)代理有一個(gè)限制,就是使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口。如果想代理沒有實(shí)現(xiàn)接口的類,就可以使用CGLIB實(shí)現(xiàn)。

Cglib是一個(gè)強(qiáng)大的高性能的代碼生成包,它可以在運(yùn)行期擴(kuò)展Java類與實(shí)現(xiàn)Java接口。它廣泛的被許多AOP的框架使用,例如Spring AOP和dynaop,為他們提供方法的interception(攔截)。

Cglib包的底層是通過使用一個(gè)小而快的字節(jié)碼處理框架ASM,來轉(zhuǎn)換字節(jié)碼并生成新的類。不鼓勵(lì)直接使用ASM,因?yàn)樗枰銓?duì)JVM內(nèi)部結(jié)構(gòu)包括class文件的格式和指令集都很熟悉。

Cglib與動(dòng)態(tài)代理最大的區(qū)別就是:

  • 使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口
  • 使用cglib代理的對(duì)象則無需實(shí)現(xiàn)接口,達(dá)到代理類無侵入。

動(dòng)態(tài)代理的用途

Java的動(dòng)態(tài)代理,在日常開發(fā)中可能并不經(jīng)常使用,但是并不代表他不重要。Java的動(dòng)態(tài)代理的最主要的用途就是應(yīng)用在各種框架中。因?yàn)槭褂脛?dòng)態(tài)代理可以很方便的運(yùn)行期生成代理類,通過代理類可以做很多事情,比如AOP,比如過濾器、攔截器等。

在我們平時(shí)使用的框架中,像servlet的filter、包括spring提供的aop以及struts2的攔截器都使用了動(dòng)態(tài)代理功能。我們?nèi)粘?吹降膍ybatis分頁插件,以及日志攔截、事務(wù)攔截、權(quán)限攔截這些幾乎全部由動(dòng)態(tài)代理的身影。

總結(jié)

本文為你介紹了網(wǎng)絡(luò)層面的正向代理和反向代理、開發(fā)模式層面的靜態(tài)代理和動(dòng)態(tài)代理。希望通過閱讀本文,你會(huì)對(duì)代理技術(shù)有一定的了解。當(dāng)然,這些概念也不要搞混哦。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號(hào)Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2020-07-27 10:40:35

C++11語言代碼

2019-08-15 09:35:03

2019-09-10 13:38:56

人工智能無人駕駛機(jī)器人

2019-10-29 15:28:40

Refs組件前端

2024-11-25 11:00:00

模型訓(xùn)練

2020-09-16 10:50:16

C++14語言代碼

2017-08-28 16:40:07

Region切分觸發(fā)策略

2017-12-08 10:42:49

HBase切分細(xì)節(jié)

2019-08-14 14:37:32

2020-01-02 10:13:46

Redis數(shù)據(jù)庫字符串

2025-05-16 09:34:10

2016-05-20 11:14:55

內(nèi)容緩存 傳輸策略優(yōu)

2016-05-20 11:26:54

客戶端優(yōu)化 直播推流

2018-12-09 16:18:38

物聯(lián)網(wǎng)無線技術(shù)通信

2018-02-26 09:08:19

企業(yè)存儲(chǔ)趨勢

2021-11-01 08:00:00

Java異常處理開發(fā)

2019-04-19 08:25:13

HBase基礎(chǔ)Google

2018-03-19 14:43:28

2017-10-24 14:57:58

AI人工智能機(jī)器學(xué)習(xí)

2019-04-22 14:12:12

HBase集群Google
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)