一個Java小程序是一個小的應(yīng)用程序?qū)懭氲腏ava編程語言或其他編程語言編譯為Java字節(jié)碼,并在Java中的形式交付給用戶的字節(jié)碼。用戶從網(wǎng)頁啟動Java applet ,然后在與Web瀏覽器本身分開的進程中在Java虛擬機(JVM)中執(zhí)行applet 。Java小程序可以出現(xiàn)在網(wǎng)頁的框架,新的應(yīng)用程序窗口,Sun的AppletViewer或用于測試小程序的獨立工具中。
Java小程序是在1995年發(fā)布的第一版Java語言中引入的。自2017年Java 9以來,Java小程序被棄用,并從2018年9月發(fā)布的Java SE 11(18。9)中刪除。[6] [7] [ 8] [9] [10]
Java applet通常用Java編寫,但也可以使用其他語言,如Jython,JRuby,Pascal,[11] Scala或Eiffel(通過SmartEiffel)。
Java applet運行速度非?欤钡2011年,它們的速度比JavaScript慢很多倍。與JavaScript不同,Java applet可以訪問3D 硬件加速,使其非常適合非平凡的計算密集型可視化。由于采用了畫布技術(shù)(或者特別是3D圖形中的WebGL),[12] [13]以及即時編譯的 JavaScript,[14]速度差異,瀏覽器已經(jīng)獲得了對硬件加速圖形的支持。變得不那么引人注目了。[ 引證需要 ]
由于Java字節(jié)碼是跨平臺的(或平臺無關(guān)的),Java applet可以由瀏覽器(或其他客戶端)執(zhí)行,用于許多平臺,包括Microsoft Windows,F(xiàn)reeBSD,Unix,macOS和Linux。它們不能在不支持Java的現(xiàn)代移動設(shè)備上運行。
內(nèi)容
1 概述
2 技術(shù)信息
2.1 類似技術(shù)
3 嵌入網(wǎng)頁
4 例子
5 優(yōu)點
6 缺點
7 與兼容性相關(guān)的訴訟
7.1 1997:Sun vs Microsoft
7.2 2002:Sun vs Microsoft
7.3 2010:Oracle與Google
8 安全
8.1 未簽名
8.2 簽名
8.3 自簽名
9 替代品
10 另見
11 參考文獻
12 外部鏈接
概述
Applet用于為Web應(yīng)用程序提供交互式功能,這些功能無法僅由HTML提供。它們可以捕獲鼠標輸入,還具有按鈕或復(fù)選框等控件。響應(yīng)于用戶動作,applet可以改變提供的圖形內(nèi)容。這使得applet非常適合演示,可視化和教學(xué)。有在線applet集合,用于研究從物理學(xué)到心臟生理學(xué)的各種科目。
applet也可以只是一個文本區(qū)域; 例如,為某個遠程系統(tǒng)提供跨平臺命令行界面。如果需要,applet可以離開專用區(qū)域并作為單獨的窗口運行。但是,applet對applet專用區(qū)域之外的網(wǎng)頁內(nèi)容幾乎沒有控制權(quán),因此與其他類型的瀏覽器擴展不同,它們對于改善網(wǎng)站外觀不太有用(而新聞代碼或WYSIWYG編輯器等applet 也是眾所周知的)。Applet還可以播放瀏覽器本身不支持的格式的媒體。
用HTML編碼的頁面可以在其中嵌入傳遞給applet的參數(shù)。因此,相同的applet可能具有不同的外觀,具體取決于傳遞的參數(shù)。
由于applet在CSS和DHTML標準之前可用,它們也被廣泛用于諸如翻轉(zhuǎn)導(dǎo)航按鈕之類的微不足道的效果。這種方法在可訪問性和濫用系統(tǒng)資源方面造成了重大問題,已不再使用,甚至在當時也非常勸阻。
技術(shù)信息
Java applet在大多數(shù)Web瀏覽器的沙箱中執(zhí)行,阻止它們訪問剪貼板或文件系統(tǒng)等本地數(shù)據(jù)。applet的代碼從Web服務(wù)器下載,之后瀏覽器將 applet 嵌入到網(wǎng)頁中或打開一個顯示applet 用戶界面的新窗口。
Java applet擴展了類java.applet.Applet,或者在Swing applet 的情況下javax.swing.JApplet。必須覆蓋applet類中的方法以在其自身內(nèi)部設(shè)置用戶界面的類(Applet)是其后代的Panel后代Container。由于applet繼承自容器,因此它與普通Java應(yīng)用程序具有相同的用戶界面可能性,包括具有用戶特定可視化的區(qū)域。
第一個實現(xiàn)涉及按類下載applet類。雖然類是小文件,但通常有很多,因此applet被稱為緩慢加載的組件。但是,由于引入了.jars,applet通常作為單個文件提供,其大小類似于圖像文件(數(shù)百千字節(jié)到幾兆字節(jié))。
的域從其中小應(yīng)用程序可執(zhí)行程序被下載是其通常的(無符號)小應(yīng)用程序被允許進行通信的唯一的域。此域可以與托管周圍HTML文檔的域不同。
Java 系統(tǒng)庫和運行時是向后兼容的,允許用戶編寫在Java虛擬機的當前版本和未來版本上運行的代碼。
類似技術(shù)
許多Java開發(fā)人員,博客和雜志都建議使用Java Web Start技術(shù)代替applet。[15] Java Web Start允許啟動未修改的applet代碼,然后在單獨的窗口(不在調(diào)用瀏覽器內(nèi))中運行。
一個Java Servlet的有時非正式相比,是“喜歡”的服務(wù)器端小程序,但它在它的語言,不同的功能,并且在每個這里描述的關(guān)于小應(yīng)用程序的特性。
嵌入網(wǎng)頁
通過使用不推薦使用的appletHTML元素[16]或推薦object元素,可以在網(wǎng)頁上顯示applet 。[17]該embed元素可以與Mozilla系列瀏覽器一起使用[18](embed在HTML 4中已棄用,但包含在HTML 5中)。這指定了applet的源和位置。兩者object和embed標簽也可以下載和安裝Java虛擬機(如果需要)或者至少導(dǎo)致插件頁面。applet和object標簽還支持加載以某種特定(而非初始)狀態(tài)開始的序列化小程序。如果瀏覽器由于任何原因無法運行,則標簽還會指定顯示代替applet的消息。
然而,盡管object正式推薦標簽,截至2010年,object標簽的支持在瀏覽器中尚未保持一致,并且Sun一直建議在舊的applet多瀏覽器環(huán)境中部署舊標簽[19],因為它仍然是唯一一致支持的標簽。流行的瀏覽器。為了支持多個瀏覽器,object標簽當前需要JavaScript(識別瀏覽器并調(diào)整標簽),使用其他特定于瀏覽器的標簽或從服務(wù)器端提供適應(yīng)的輸出。棄用applet標簽一直受到批評。Oracle現(xiàn)在提供了一個維護的JavaScript代碼[20]來啟動具有跨平臺解決方案的applet。
Java瀏覽器插件依賴于NPAPI,許多Web瀏覽器供應(yīng)商因其年齡和安全問題而棄用。2016年1月,Oracle宣布基于JDK 9的Java運行時環(huán)境將停止使用瀏覽器插件。[21]
示例
以下示例說明了通過java.applet包使用Java applet。該示例還使用Java Abstract Window Toolkit(AWT)中的類來生成消息“ Hello,world! ”作為輸出。
import java.applet。* ;
import java.awt。* ;
//“Hello,world!”的Applet代碼 例。
//這應(yīng)保存在名為“HelloWorld.java”的文件中。
公共 類 HelloWorld 擴展 Applet {
//在屏幕上打印一條消息(x = 20,y = 10)。
public void paint (Graphics g ) {
g 。drawString之(“你好,世界!” , 20 , 10 );
//在屏幕上繪制一個圓圈(x = 40,y = 30)。
g 。drawArc (40 , 30 , 20 , 20 , 0 , 360 );
//在屏幕上繪制一個矩形(x1 = 100,y1 = 100,x2 = 300,y2 = 300)。
g 。drawRect中(100 , 100 , 300 , 300 );
//在屏幕上繪制一個正方形(x1 = 100,y1 = 100,x2 = 200,y2 = 200)。
g 。drawRect中(100 , 100 , 200 , 200 );
}
}
簡單的applet可以在Internet上自由共享,用于自定義支持插件的應(yīng)用程序。
編譯之后,生成的.class文件可以放在Web服務(wù)器上,并使用<applet>或<object>標記在HTML頁面中調(diào)用。例如:
<!DOCTYPE html>
< html >
< head >
< title > HelloWorld_example.html </ title >
</ head >
< body >
< h1 > Java applet示例</ h1 >
< p >
這里是:
< applet code = “HelloWorld.class” height = “40” width = “200” >
這是HelloWorld.class運行的地方。
</ applet >
</ p >
</ body >
</ html >
訪問該頁面時,其內(nèi)容如下:
一個Java applet示例
這是:你好,世界!
為了大限度地縮短下載時間,可以以jar文件的形式提供applet 。對于此示例,如果將所有必需的類放在壓縮歸檔example.jar中,則可以使用以下嵌入代碼:
< p >
這里是:
< applet archive = “example.jar” code = “HelloWorld” height = “40” width = “200” >
這是HelloWorld.class運行的地方。
</ applet >
</ p >
Sun的官方頁面中詳細介紹了Applet包含有關(guān)APPLET標記的內(nèi)容。[22]
優(yōu)點
Java applet可以具有以下任何或所有優(yōu)點:[23]
使它在FreeBSD,Linux,Microsoft Windows和macOS上運行很簡單 - 也就是說,使它跨平臺。在21世紀的前十年,大多數(shù)網(wǎng)絡(luò)瀏覽器都支持小程序; 然而,從那以后,出于安全原因,大多數(shù)瀏覽器都放棄了applet支持。
同一個applet可以同時處理“所有”安裝的Java版本,而不僅僅是新的插件版本。但是,如果applet需要更高版本的Java Runtime Environment(JRE),則客戶端將在大型下載期間被迫等待。
大多數(shù)Web瀏覽器都會緩存 applet,因此在返回網(wǎng)頁時可以快速加載它們。Applet也隨著使用而改進:運行第一個applet后,JVM已經(jīng)運行并快速啟動(每次瀏覽器重新啟動時JVM都需要重新啟動)。當瀏覽器從包含applet的一個HTML頁面導(dǎo)航到包含applet的另一個HTML頁面時,JRE 1.5及更高版本會停止JVM并重新啟動它。
它可以將工作從服務(wù)器轉(zhuǎn)移到客戶端,使得Web解決方案可以根據(jù)用戶/客戶端的數(shù)量進行擴展。
如果獨立程序(如Google Earth)與Web服務(wù)器通信,則該服務(wù)器通常需要為尚未更新其客戶端軟件的用戶支持所有先前版本。相反,正確配置的瀏覽器會加載(和緩存)新的applet版本,因此不需要支持舊版本。
applet自然支持不斷變化的用戶狀態(tài),例如棋盤上的數(shù)字位置。
開發(fā)人員可以直接通過創(chuàng)建主例程(在applet的類中或在單獨的類中)并在applet上調(diào)用init()和start()來直接開發(fā)和調(diào)試applet,從而允許在他們喜歡的Java SE開發(fā)環(huán)境中進行開發(fā)。之后所有人都必須在AppletViewer程序或Web瀏覽器中重新測試applet,以確保它符合安全限制。
一個不受信任的小應(yīng)用程序到本地機器不能訪問,只能訪問它來自服務(wù)器。這使得這樣的applet比它可以替換的獨立可執(zhí)行文件更安全。但是,如果用戶同意,簽名的applet可以對其運行的計算機具有完全訪問權(quán)限。
Java applet很快,甚至可以與本機安裝的軟件具有相似的性能。
缺點
此部分需要額外引用以進行驗證。請通過向可靠來源添加引文來幫助改進本文。無法查證的內(nèi)容可能被提出異議而移除。查找來源:“Java applet” - 新聞· 報紙· 書籍· 學(xué)者· JSTOR
(2015年8月)(了解如何以及何時刪除此模板消息)
與其他客戶端Web技術(shù)相比,Java applet可能具有以下任何缺點:
Java applet依賴于Java Runtime Environment(JRE),這是一個相當復(fù)雜和重量級的軟件包。它通常還需要Web瀏覽器的插件。某些組織僅允許管理員安裝的軟件。因此,某些用戶只能查看足夠重要的applet,以便與管理員聯(lián)系以請求安裝JRE和插件。
如果applet需要比系統(tǒng)上可用的更新的JRE或特定的JRE,則第一次運行它的用戶將需要等待大型JRE下載完成。
iOS或Android上的移動瀏覽器根本不運行Java小程序。[24]隨著移動操作系統(tǒng)的興起,桌面瀏覽器逐步淘汰Java applet支持。
與舊applet標記不同,object標記需要使用變通方法來編寫跨瀏覽器的HTML文檔。
沒有標準可以讓屏幕閱讀器可以使用applet的內(nèi)容。因此,applet可能會損害具有特殊需求的用戶訪問網(wǎng)站的可能性。
與任何客戶端腳本一樣,安全性限制可能使不受信任的applet難以甚至不可能實現(xiàn)所需的目標。但是,只需編輯JAVA JRE安裝中的java.policy文件,就可以授予對本地文件系統(tǒng)或系統(tǒng)剪貼板的訪問權(quán)限,也可以授予除向applet提供給瀏覽器的網(wǎng)絡(luò)源以外的其他網(wǎng)絡(luò)源。
與兼容性相關(guān)的訴訟
Sun已經(jīng)做出了相當大的努力來確保Java版本之間的兼容性得以保持,并在必要時依法強制實施Java可移植性。Oracle似乎在繼續(xù)采用相同的策略。
1997年:Sun對微軟
1997年的訴訟[25]是在微軟創(chuàng)建了自己的改進的Java虛擬機之后提交的,該虛擬機隨Internet Explorer一起提供。Microsoft 在java.awt,java.lang和java.io包中的類中添加了大約50個方法和50個字段[25]。其他修改包括刪除RMI功能和將Java本機接口從JNI 替換為RNI,這是一種不同的標準。RMI被刪除,因為它只能輕松支持Java到Java通信并與Microsoft DCOM競爭技術(shù)。依賴這些更改或只是無意中使用它們的小程序僅在Microsoft的Java系統(tǒng)中起作用。Sun起訴違反商標,因為Java的重點是不應(yīng)該有專有擴展,并且代碼應(yīng)該在任何地方都可以使用。微軟同意向Sun支付2000萬美元,并且Sun同意授予Microsoft有限許可,僅在有限的時間內(nèi)不使用Java進行修改。[26]
2002年:Sun與微軟
微軟繼續(xù)發(fā)布自己未經(jīng)修改的Java虛擬機。多年來它變得非常過時但仍然是Internet Explorer的默認設(shè)置。后來的一項研究表明,這次的applet經(jīng)常包含自己的類,它們以有限的方式反映Swing和其他新功能。[27] 2002年,Sun提起反壟斷訴訟,聲稱微軟試圖非法壟斷已經(jīng)損害了Java平臺。Sun要求微軟將Sun當前的二進制Java技術(shù)實施作為Windows的一部分進行分發(fā),將其作為舊版Microsoft桌面操作系統(tǒng)的推薦更新進行分發(fā),并停止分發(fā)微軟的虛擬機(因為其在之前的訴訟中同意的許可時間已經(jīng)過過期)。[26]微軟為未決的反托拉斯問題支付了7億美元,為專利問題支付了9億美元,并為將來使用Sun的軟件支付了3.5億美元的特許權(quán)使用費。[28] [ 需要非主要來源 ]
2010年:甲骨文與谷歌
另請參閱:Oracle訴谷歌
Google開發(fā)了自己的Android平臺,該平臺使用Java功能和概念,但與標準庫不兼容。這可能違反Sun授予OpenJDK專利的條件,以便為所有人使用開源Java。2010年,甲骨文起訴谷歌[29]以“錯誤的方式”使用Java,聲稱“谷歌的Android與甲骨文美國的Java競爭”以及“谷歌已經(jīng)意識到Sun的專利組合......”因為谷歌聘請了某些前Sun公司Java工程師“。2012年5月,該案件的陪審團發(fā)現(xiàn)谷歌沒有侵犯甲骨文的專利,審判法官裁定谷歌使用的Java API結(jié)構(gòu)不具有版權(quán)。[30] [31]
安全
有兩種applet類型具有非常不同的安全模型:簽名小程序和未簽名小程序。[32]自Java SE 7 Update 21(2013年4月)起,鼓勵小程序和Web-Start應(yīng)用程序使用受信任的證書進行簽名,并在運行未簽名的小程序時顯示警告消息。[33]進一步從Java 7 Update 51開始,默認情況下會阻止未簽名的applet; 可以通過在Java控制面板中創(chuàng)建異常來運行它們。[34]
未簽名
對未簽名的小程序的限制被理解為“嚴苛的”:他們無法訪問僅限于applet下載站點的本地文件系統(tǒng)和Web訪問; 還有許多其他重要的限制。例如,他們無法訪問所有系統(tǒng)屬性,使用自己的類加載器,調(diào)用本機代碼,在本地系統(tǒng)上執(zhí)行外部命令,或者重新定義屬于作為Java版本一部分包含的核心包的類。雖然它們可以在獨立框架中運行,但這樣的框架包含一個標頭,表明這是一個不受信任的小程序。成功初始調(diào)用禁止方法不會自動創(chuàng)建安全漏洞,因為訪問控制器會檢查整個堆棧 調(diào)用代碼以確保呼叫不是來自不正確的位置。
與任何復(fù)雜系統(tǒng)一樣,自Java首次發(fā)布以來,已發(fā)現(xiàn)并修復(fù)了許多安全問題。其中一些(如日歷序列化安全性錯誤)持續(xù)了很多年,沒有人知道。其他人在野外被惡意軟件使用。[ 引證需要 ]
一些研究提到applet崩潰瀏覽器或過度使用CPU資源但這些被歸類為麻煩而不是真正的安全漏洞。但是,未簽名的applet可能涉及組合攻擊,這些攻擊利用系統(tǒng)其他部分中的多個嚴重配置錯誤的組合。未簽名的applet在托管它的服務(wù)器上直接運行也會更危險,因為雖然代碼庫允許它與服務(wù)器通信,但在其內(nèi)部運行可以繞過防火墻。applet也可能在托管它的服務(wù)器上嘗試DoS攻擊,但通常管理該網(wǎng)站的人也管理applet,這使得這不合理。社區(qū)可以通過源代碼審查或在專用域上運行applet 來解決此問題。
未簽名的小程序還可以嘗試下載托管在原始服務(wù)器上的惡意軟件。但是,它只能將此類文件存儲到臨時文件夾中(因為它是瞬態(tài)數(shù)據(jù)),并且無法通過執(zhí)行它來完成攻擊。有人嘗試使用applet以這種方式傳播Phoenix和Siberia漏洞,[ 引證需要 ]但是這些漏洞利用內(nèi)部不使用Java,并且還以其他幾種方式分發(fā)。
簽名
簽名的小程序[35]包含一個簽名,瀏覽器應(yīng)通過遠程運行的獨立證書頒發(fā)機構(gòu)服務(wù)器進行驗證。生成此簽名涉及專門的工具以及與權(quán)威服務(wù)器維護人員的交互。驗證簽名并且當前計算機的用戶也批準后,簽名的applet可以獲得更多權(quán)限,變得等同于普通的獨立程序。理由是,小程序的作者現(xiàn)在已知,并將對任何故意損害負責(zé)。[ 含糊 ]這種方法允許applet用于許多客戶端腳本無法實現(xiàn)的任務(wù)。但是,這種方法需要用戶承擔(dān)更多責(zé)任,決定他或她信任誰。相關(guān)的問題包括無響應(yīng)的授權(quán)服務(wù)器,在頒發(fā)證書時對簽名者身份的錯誤評估,以及仍然做出用戶不會批準的事情的已知applet發(fā)布者。因此,從Java 1.1出現(xiàn)的簽名小程序?qū)嶋H上可能有更多的安全問題。
自簽名
自簽名applet是開發(fā)人員自己簽署的applet,可能會帶來安全風(fēng)險; java插件在請求自簽名applet的授權(quán)時提供警告,因為applet的功能和安全性僅由開發(fā)人員本身保證,并且尚未經(jīng)過獨立確認。此類自簽名證書通常僅在發(fā)布之前的開發(fā)期間使用,其中第三方確認安全性并不重要,但大多數(shù)applet開發(fā)人員將尋求第三方簽名以確保用戶信任applet的安全性。
Java安全問題與任何客戶端腳本平臺的類似問題沒有根本的區(qū)別[36] [ 引證需要 ]。特別是,與簽名小程序相關(guān)的所有問題也適用于Microsoft ActiveX組件。
截至2014年,常用的Java插件或Java Web Start不再接受自簽名和未簽名的applet。因此,希望部署Java小程序的開發(fā)人員別無選擇,只能從商業(yè)來源獲取可信證書。
替代品
存在替代技術(shù)(例如,JavaScript),其滿足applet可能的全部或更多范圍。其中,JavaScript并不總是被視為競爭的替代品[ 由誰?] ; JavaScript可以與同一頁面中的applet共存,協(xié)助啟動applet(例如,在單獨的框架中或提供平臺解決方法),然后從applet代碼調(diào)用。JavaFX是Java平臺的擴展,也可以作為替代方案。