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