⑴ MD5是如何編譯的
MD5簡介
MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。
Message-Digest泛指位元組串(Message)的Hash變換,就是把一個任意長度的位元組串變換成一定長的大整數。請注意我使用了「位元組串」而不是「字元串」這個詞,是因為這種變換只與位元組的值有關,與字元集或編碼方式無關。
MD5將任意長度的「位元組串」變換成一個128bit的大整數,並且它是一個不可逆的字元串變換演算法,換句話說就是,即使你看到源程序和演算法描述,也無法將一個MD5的值變換回原始的字元串,從數學原理上說,是因為原始的字元串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的「抵賴」,這就是所謂的數字簽名應用。
MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,而系統並不「知道」用戶的密碼是什麼。
一些黑客破獲這種密碼的方法是一種被稱為「跑字典」的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。
即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要TB級的磁碟組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。
在很多電子商務和社區應用中,管理用戶的Account是一種最常用的基本功能,盡管很多Application Server提供了這些基本組件,但很多應用開發者為了管理的更大的靈活性還是喜歡採用關系資料庫來管理用戶,懶惰的做法是用戶的密碼往往使用明文或簡單的變換後直接保存在資料庫中,因此這些用戶的密碼對軟體開發者或系統管理員來說可以說毫無保密可言,本文的目的是介紹MD5的java Bean的實現,同時給出用MD5來處理用戶的Account密碼的例子,這種方法使得管理員和程序設計者都無法看到用戶的密碼,盡管他們可以初始化它們。但重要的一點是對於用戶密碼設置習慣的保護。
有興趣的讀者可以從這里取得MD5也就是RFC 1321的文本。 http://www.ietf.org/rfc/rfc1321.txt
實現策略
MD5的演算法在RFC1321中實際上已經提供了C的實現,我們其實馬上就能想到,至少有兩種用Java實現它的方法,第一種是,用Java語言重新寫整個演算法,或者再說簡單點就是把C程序改寫成Java程序。第二種是,用JNI(Java Native Interface)來實現,核心演算法仍然用這個C程序,用Java類給它包個殼。
但我個人認為,JNI應該是Java為了解決某類問題時的沒有辦法的辦法(比如與操作系統或I/O設備密切相關的應用),同時為了提供和其它語言的互操作性的一個手段。使用JNI帶來的最大問題是引入了平台的依賴性,打破了SUN所鼓吹的「一次編寫到處運行」的Java好處。因此,我決定採取第一種方法,一來和大家一起嘗試一下「一次編寫到處運行」的好處,二來檢驗一下Java 2現在對於比較密集的計算的效率問題。
實現過程
限於這篇文章的篇幅,同時也為了更多的讀者能夠真正專注於問題本身,我不想就某一種Java集成開發環境來介紹這個Java Bean的製作過程,介紹一個方法時我發現步驟和命令很清晰,我相信有任何一種Java集成環境三天以上經驗的讀者都會知道如何把這些代碼在集成環境中編譯和運行。用集成環境講述問題往往需要配很多屏幕截圖,這也是我一直對集成環境很頭疼的原因。我使用了一個普通的文本編輯器,同時使用了Sun公司標準的JDK 1.3.0 for Windows NT。
其實把C轉換成Java對於一個有一定C語言基礎的程序員並不困難,這兩個語言的基本語法幾乎完全一致.我大概花了一個小時的時間完成了代碼的轉換工作,我主要作了下面幾件事:
把必須使用的一些#define的宏定義變成Class中的final static,這樣保證在一個進程空間中的多個Instance共享這些數據
刪去了一些無用的#if define,因為我只關心MD5,這個推薦的C實現同時實現了MD2 MD3和 MD4,而且有些#if define還和C不同編譯器有關
將一些計算宏轉換成final static 成員函數。
所有的變數命名與原來C實現中保持一致,在大小寫上作一些符合Java習慣的變化,計算過程中的C函數變成了private方法(成員函數)。
關鍵變數的位長調整
定義了類和方法
需要注意的是,很多早期的C編譯器的int類型是16 bit的,MD5使用了unsigned long int,並認為它是32bit的無符號整數。而在Java中int是32 bit的,long是64 bit的。在MD5的C實現中,使用了大量的位操作。這里需要指出的一點是,盡管Java提供了位操作,由於Java沒有unsigned類型,對於右移位操作多提供了一個無符號右移:>>>,等價於C中的 >> 對於unsigned 數的處理。
因為Java不提供無符號數的運算,兩個大int數相加就會溢出得到一個負數或異常,因此我將一些關鍵變數在Java中改成了long類型(64bit)。我個人認為這比自己去重新定義一組無符號數的類同時重載那些運算符要方便,同時效率高很多並且代碼也易讀,OO(Object Oriented)的濫用反而會導致效率低下。
限於篇幅,這里不再給出原始的C代碼,有興趣對照的讀者朋友可以去看RFC 1321。MD5.java源代碼
測試
在RFC 1321中,給出了Test suite用來檢驗你的實現是否正確:
MD5 ("") =
MD5 ("a") =
MD5 ("abc") =
MD5 ("message digest") =
MD5 ("abcdefghijklmnopqrstuvwxyz") =
……
這些輸出結果的含義是指:空字元串」」的MD5值是,字元串」a」的MD5值是……
編譯並運行我們的程序:
javac –d . MD5.java
java beartool.MD5
為了將來不與別人的同名程序沖突,我在我的程序的第一行使用了package beartool;
因此編譯命令javac –d . MD5.java 命令在我們的工作目錄下自動建立了一個beartool目錄,目錄下放著編譯成功的 MD5.class
我們將得到和Test suite同樣的結果。當然還可以繼續測試你感興趣的其它MD5變換,例如:
java beartool.MD5 1234
將給出1234的MD5值。
可能是我的計算機知識是從Apple II和Z80單板機開始的,我對大寫十六進制代碼有偏好,如果您想使用小寫的Digest String只需要把byteHEX函數中的A、B、C、D、E、F改成a、b、 c、d、e、f就可以了。
MD5據稱是一種比較耗時的計算,我們的Java版MD5一閃就算出來了,沒遇到什麼障礙,而且用肉眼感覺不出來Java版的MD5比C版的慢。
為了測試它的兼容性,我把這個MD5.class文件拷貝到我的另一台Linux+IBM JDK 1.3的機器上,執行後得到同樣結果,確實是「一次編寫到處運行了」。
Java Bean簡述
現在,我們已經完成並簡單測試了這個Java Class,我們文章的標題是做一個Java Bean。
其實普通的Java Bean很簡單,並不是什麼全新的或偉大的概念,就是一個Java的Class,盡管 Sun規定了一些需要實現的方法,但並不是強制的。而EJB(Enterprise Java Bean)無非規定了一些必須實現(非常類似於響應事件)的方法,這些方法是供EJB Container使用(調用)的。
在一個Java Application或Applet里使用這個bean非常簡單,最簡單的方法是你要使用這個類的源碼工作目錄下建一個beartool目錄,把這個class文件拷貝進去,然後在你的程序中import beartool.MD5就可以了。最後打包成.jar或.war是保持這個相對的目錄關系就行了。
Java還有一個小小的好處是你並不需要摘除我們的MD5類中那個main方法,它已經是一個可以工作的Java Bean了。Java有一個非常大的優點是她允許很方便地讓多種運行形式在同一組代碼中共存,比如,你可以寫一個類,它即是一個控制台Application和GUI Application,同時又是一個Applet,同時還是一個Java Bean,這對於測試、維護和發布程序提供了極大的方便,這里的測試方法main還可以放到一個內部類中,有興趣的讀者可以參考: http://www.cn.ibm.com/developerWorks/java/jw-tips/tip106/index.shtml
這里講述了把測試和示例代碼放在一個內部靜態類的好處,是一種不錯的工程化技巧和途徑。
把Java Bean裝到JSP里
正如我們在本文開頭講述的那樣,我們對這個MD5 Bean的應用是基於一個用戶管理,這里我們假設了一個虛擬社區的用戶login過程,用戶的信息保存在資料庫的個名為users的表中。這個表有兩個欄位和我們的這個例子有關,userid :char(20)和pwdmd5 :char(32),userid是這個表的Primary Key,pwdmd5保存密碼的MD5串,MD5值是一個128bit的大整數,表示成16進制的ASCII需要32個字元。
這里給出兩個文件,login.html是用來接受用戶輸入的form,login.jsp用來模擬使用MD5 Bean的login過程。
為了使我們的測試環境簡單起見,我們在JSP中使用了JDK內置的JDBC-ODBC Bridge Driver,community是ODBC的DSN的名字,如果你使用其它的JDBC Driver,替換掉login.jsp中的
Connection con= DriverManager.getConnection("jdbc:odbc:community", "", "");
即可。
login.jsp的工作原理很簡單,通過post接收用戶輸入的UserID和Password,然後將Password變換成MD5串,然後在users表中尋找UserID和pwdmd5,因為UserID是users表的Primary Key,如果變換後的pwdmd5與表中的記錄不符,那麼SQL查詢會得到一個空的結果集。
這里需要簡單介紹的是,使用這個Bean只需要在你的JSP應用程序的WEB-INF/classes下建立一個beartool目錄,然後將MD5.class拷貝到那個目錄下就可以了。如果你使用一些集成開發環境,請參考它們的deploy工具的說明。在JSP使用一個java Bean關鍵的一句聲明是程序中的第2行:
<jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>
這是所有JSP規范要求JSP容器開發者必須提供的標准Tag。
id=實際上是指示JSP Container創建Bean的實例時用的實例變數名。在後面的<%和%>之間的Java程序中,你可以引用它。在程序中可以看到,通過 pwdmd5=oMD5.getMD5ofStr (password)引用了我們的MD5 Java Bean提供的唯一一個公共方法: getMD5ofStr。
Java Application Server執行.JSP的過程是先把它預編譯成.java(那些Tag在預編譯時會成為java語句),然後再編譯成.class。這些都是系統自動完成和維護的,那個.class也稱為Servlet。當然,如果你願意,你也可以幫助Java Application Server去干本該它乾的事情,自己直接去寫Servlet,但用Servlet去輸出HTML那簡直是回到了用C寫CGI程序的惡夢時代。
如果你的輸出是一個復雜的表格,比較方便的方法我想還是用一個你所熟悉的HTML編輯器編寫一個「模板」,然後在把JSP代碼「嵌入」進去。盡管這種JSP代碼被有些專家指責為「空心粉」,它的確有個缺點是代碼比較難管理和重復使用,但是程序設計永遠需要的就是這樣的權衡。我個人認為,對於中、小型項目,比較理想的結構是把數據表示(或不嚴格地稱作WEB界面相關)的部分用JSP寫,和界面不相關的放在Bean裡面,一般情況下是不需要直接寫Servlet的。
如果你覺得這種方法不是非常的OO(Object Oriented),你可以繼承(extends)它一把,再寫一個bean把用戶管理的功能包進去。
到底能不能兼容?
我測試了三種Java應用伺服器環境,Resin 1.2.3、Sun J2EE 1.2、IBM WebSphere 3.5,所幸的是這個Java Bean都沒有任何問題,原因其實是因為它僅僅是個計算程序,不涉及操作系統,I/O設備。其實用其它語言也能簡單地實現它的兼容性的,Java的唯一優點是,你只需提供一個形態的運行碼就可以了。請注意「形態」二字,現在很多計算結構和操作系統除了語言本身之外都定義了大量的代碼形態,很簡單的一段C語言核心代碼,轉換成不同形態要考慮很多問題,使用很多工具,同時受很多限制,有時候學習一種新的「形態」所花費的精力可能比解決問題本身還多。比如光Windows就有EXE、Service、的普通DLL、COM DLL以前還有OCX等等等等,在Unix上雖說要簡單一些,但要也要提供一個.h定義一大堆宏,還要考慮不同平台編譯器版本的位長度問題。我想這是Java對我來說的一個非常重要的魅力吧。
MD5演算法說明
一、補位
二、補數據長度
三、初始化MD5參數
四、處理位操作函數
五、主要變換過程
六、輸出結果
補位:
MD5演算法先對輸入的數據進行補位,使得數據位長度LEN對512求余的結果是448。即數據擴展至K*512+448位。即K*64+56個位元組,K為整數。
具體補位操作:補一個1,然後補0至滿足上述要求。
補數據長度:
用一個64位的數字表示數據的原始長度B,把B用兩個32位數表示。這時,數
據就被填補成長度為512位的倍數。
初始化MD5參數:
四個32位整數 (A,B,C,D) 用來計算信息摘要,初始化使用的是十六進製表
示的數字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
處理位操作函數:
X,Y,Z為32位整數。
F(X,Y,Z) = X&Y|NOT(X)&Z
G(X,Y,Z) = X&Z|Y?(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X|not(Z))
主要變換過程:
使用常數組T[1 ... 64], T[i]為32位整數用16進製表示,數據用16個32位
的整數數組M[]表示。
具體過程如下:
/* 處理數據原文 */
For i = 0 to N/16-1 do
/*每一次,把數據原文存放在16個元素的數組X中. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /結束對J的循環
/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D
/* 第1輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3
22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7
22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA
11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15]
[BCDA 15 22 16]
/* 第2輪* */
/* 以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA
0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23]
[BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA
8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA
12 20 32]
/* 第3輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35]
[BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA
10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43]
[BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47]
[BCDA 2 23 48]
/* 第4輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51]
[BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55]
[BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59]
[BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63]
[BCDA 9 21 64]
/* 然後進行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD
end /* 結束對I的循環*/
輸出結果。
⑵ 以.html .asp .jsp .php這幾種為鏈接結尾的網頁各有什麼特點
html或htm 結尾的文件是靜態的網頁,就是裡面的東西都是事先寫好的。但近來,為了減輕伺服器壓力和便於收錄,現在都是是通過動態網站發布後生成的靜態頁面。
目前,最常用的三種動態網頁語言有ASP(Active Server Pages),JSP(Java Server Pages),
PHP (Hypertext Preprocessor)。
簡 介
ASP全名Active Server Pages,是一個WEB伺服器端的開發環境, 利用它可以產生和運
行動態的、交互的、高性能的WEB服務應用程序。ASP採用腳本語言VB Script(Java script
)作為自己的開發語言。
PHP是一種跨平台的伺服器端的嵌入式腳本語言. 它大量地借用C,Java和Perl語言的語法
, 並耦合PHP自己的特性,使WEB開發者能夠快速地寫出動態生成頁面.它支持目前絕大多數數
據庫。還有一點,PHP是完全免費的,不用花錢,你可以從PHP官方站點(http://www.php.net)自由下載。而且你可以不受限制地獲得源碼,甚至可以從中加進你自己需要的特色。
JSP 是Sun公司推出的新一代站點開發語言,他完全解決了目前ASP,PHP的一個通病--
腳本級執行(據說PHP4 也已經在Zend 的支持下,實現編譯運行).Sun 公司藉助自己在Jav
a 上的不凡造詣,將Java 從Java 應用程序 和 Java Applet 之外,又有新的碩果,就是Js
p--Java Server Page。Jsp 可以在Serverlet和JavaBean的支持下,完成功能強大的站點
程序。
三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。
但JSP代碼被編譯成 Servlet 並由 Java 虛擬機解釋執行,這種編譯操作僅在對 JSP 頁面的
第一次請求時發生。在 ASP 、PHP、JSP 環境下, HTML 代碼主要負責描述信息的顯示樣式
,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴於 Web 伺服器,而 ASP 、PH
P、JSP 頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入到
HTML 代碼中,然後一起發送給瀏覽器。 ASP 、PHP、 JSP三者都是面向 Web 伺服器的技術
,客戶端瀏覽器不需要任何附加的軟體支持。
技術特點
ASP:
1. 使用 VBScript 、 JScript 等簡單易懂的腳本語言,結合 HTML 代碼,即可快速地完成
網站的應用程序。
2. 無須 compile 編譯,容易編寫,可在伺服器端直接執行。
3. 使用普通的文本編輯器,如 Windows 的記事本,即可進行編輯設計。
4. 與瀏覽器無關 (Browser Independence), 用戶端只要使用可執行 HTML 碼的瀏覽器,即
可瀏覽 Active Server Pages 所設計的網頁內容。 Active Server Pages 所使用的腳本語
言 (VBScript 、 Jscript) 均在 WEB 伺服器端執行,用戶端的瀏覽器不需要能夠執行這些
腳本語言。
5.Active Server Pages 能與任何 ActiveX scripting 語言相容。除了可使用 VBScript
或 JScript 語言來設計外,還通過 plug-in 的方式,使用由第三方所提供的其他腳本語言
,譬如 REXX 、 Perl 、 Tcl 等。腳本引擎是處理腳本程序的 COM(Component Object Mod
el) 物件。
6. 可使用伺服器端的腳本來產生客戶端的腳本。
7.ActiveX Server Components(ActiveX 伺服器元件 ) 具有無限可擴充性。可以使用 Vi
sual Basic 、 Java 、 Visual C++ 、 COBOL 等編程語言來編寫你所需要的ActiveX Se
rver Component 。
PHP:
1.資料庫連接
PHP可以編譯成具有與許多資料庫相連接的函數。PHP與MySQL是現在絕佳的組合。你還可
以自己編寫外圍的函數取間接存取資料庫。通過這樣的途徑當你更換使用的資料庫時,可以
輕松地更改編碼以適應這樣的變。PHPLIB就是最常用的可以提供一般事務需要的一系列基庫
。但PHP提供的資料庫介面支持彼此不統一,比如對Oracle, MySQL, Sybase的介面,彼此
都不一樣。這也是PHP的一個弱點。
2.面向對象編程
PHP提供了類和對象。基於web的編程工作非常需要面向對象編程能力。PHP支持構造器、
提取類等。
JSP:
1.將內容的生成和顯示進行分離
使用JSP技術,Web頁面開發人員可以使用HTML或者XML標識來設計和格式化最終頁面。使
用JSP標識或者小腳本來生成頁面上的動態內容。生成內容的邏輯被封裝在標識和JavaBeans
組件中,並且捆綁在小腳本中,所有的腳本在伺服器端運行。如果核心邏輯被封裝在標識和
Beans中,那麼其他人,如Web管理人員和頁面設計者,能夠編輯和使用JSP頁面,而不影響內
容的生成。
在伺服器端,JSP引擎解釋JSP標識和小腳本,生成所請求的內容(例如,通過訪問Java
Beans組件,使用JDBCTM技術訪問資料庫,或者包含文件),並且將結果以HTML(或者XML)
頁面的形式發送回瀏覽器。這有助於作者保護自己的代碼,而又保證任何基於HTML的Web瀏覽
器的完全可用性。
2.強調可重用的組件
絕大多數JSP頁面依賴於可重用的,跨平台的組件(JavaBeans或者Enterprise JavaBea
nsTM組件)來執行應用程序所要求的更為復雜的處理。開發人員能夠共享和交換執行普通操
作的組件,或者使得這些組件為更多的使用者或者客戶團體所使用。基於組件的方法加速了
總體開發過程,並且使得各種組織在他們現有的技能和優化結果的開發努力中得到平衡。
3.採用標識簡化頁面開發
Web頁面開發人員不會都是熟悉腳本語言的編程人員。JavaServer Page技術封裝了許多
功能,這些功能是在易用的、與JSP相關的XML標識中進行動態內容生成所需要的。標準的JS
P標識能夠訪問和實例化JavaBeans組件,設置或者檢索組件屬性,下載Applet,以及執行用
其他方法更難於編碼和耗時的功能。
通過開發定製化標識庫,JSP技術是可以擴展的。今後,第三方開發人員和其他人員可以
為常用功能創建自己的標識庫。這使得Web頁面開發人員能夠使用熟悉的工具和如同標識一樣
的執行特定功能的構件來工作。
JSP技術很容易整合到多種應用體系結構中,以利用現存的工具和技巧,並且擴展到能夠
支持企業級的分布式應用。作為採用Java技術家族的一部分,以及Java 2(企業版體系結構
)的一個組成部分,JSP技術能夠支持高度復雜的基於Web的應用。
由於JSP頁面的內置腳本語言是基於Java編程語言的,而且所有的JSP頁面都被編譯成為
Java Servlet,JSP頁面就具有Java技術的所有好處,包括健壯的存儲管理和安全性。
作為Java平台的一部分,JSP擁有Java編程語言「一次編寫,各處運行」的特點。隨著越
來越多的供應商將JSP支持添加到他們的產品中,您可以使用自己所選擇的伺服器和工具,更
改工具或伺服器並不影響當前的應用。
應用范圍
ASP是Microsoft開發的動態網頁語言,也繼承了微軟產品的一貫傳統——只能運行於微軟
的伺服器產品,IIS (Internet Information Server) (windows NT)和PWS(Personal Web Se
rver)(windows 98)上。Unix下也有ChiliSoft的插件來支持ASP,但是ASP本身的功能有限,
必須通過ASP+COM的組合來擴充,Unix下的COM實現起來非常困難。
PHP3可在Windows,Unix,Linux的Web伺服器上正常運行,還支持IIS,Apache等通用Web伺服器
,用戶更換平台時,無需變換PHP3代碼,可即拿即用.
JSP同PHP3類似,幾乎可以運行於所有平台。如Win NT,Linux,Unix. NT下IIS通過一個插
件,例如JRUN或者ServletExec,就能支持JSP。著名的Web伺服器Apache已經能夠支持JSP。
由於Apache廣泛應用在NT、Unix和Linux上,因此JSP有更廣泛的運行平台。雖然現在NT操作
系統佔了很大的市場份額,但是在伺服器方面Unix的優勢仍然很大,而新崛起的Linux更是來
勢不小。從一個平台移植到另外一個平台,JSP和JavaBean甚至不用重新編譯,因為Java位元組
碼都是標準的與平台無關的。
性能比較
有人做過試驗,對這三種語言分別做循環性能測試及存取Oracle資料庫測試。
在循環性能測試中,JSP只用了令人吃驚的四秒鍾就結束了20000*20000的循環。而ASP
、PHP測試的是2000*2000循環(少一個數量級),卻分別用了63秒和84秒。(參考PHPLIB)
。
資料庫測試中,三者分別對 Oracle 8 進行 1000 次 Insert,Update,Select,和Delete
: Jsp 需要 13 秒,Php 需要 69 秒,ASP則 需要 73 秒。
前景分析
目前在國內PHP與ASP應用最為廣泛。而JSP由於是一種較新的技術,國內採用的較少。但在
國外,JSP已經是比較流行的一種技術,尤其是電子商務類的網站,多採用JSP。
採用PHP的網站如新浪網(sina)、中國人(Chinaren)等,但由於PHP本身存在的一些缺
點,使得它不適合應用於大型電子商務站點,而更適合一些小型的商業站點。
首先,PHP缺乏規模支持。其次,缺乏多層結構支持。對於大負荷站點,解決方法只有一
個:分布計算。資料庫、應用邏輯層、表示邏輯層彼此分開,而且同層也可以根據流量分開
,組成二維陣列。而PHP則缺乏這種支持。還有上面提到過的一點,PHP提供的資料庫介面支
持不統一,這就使得它不適合運用在電子商務中。
ASP和JSP則沒有以上缺陷,ASP可以通過Microsoft Windowsd的COM/DCOM獲得ActiveX規
模支持,通過DCOM和Transcation Server獲得結構支持;JSP可以通過SUN Java的Java Clas
s和EJB獲得規模支持,通過EJB/CORBA以及眾多廠商的Application Server獲得結構支持。
三者中,JSP應該是未來發展的趨勢。世界上一些大的電子商務解決方案提供商都採用J
SP/Servlet。比較出名的如IBM的E-business,它的核心是採用JSP/Servlet的WebSphere;
西方另外一個非常著名的電子商務軟體提供商,Intershop。它原來的產品Intershop1 2, 3
, 4占據了主要的電子商務軟體份額。它們都是通過CGI來提供支持 的。但去年10月後它推出
了Enfinity,一個採用JSP/Servlet的電子商務Application Server,而且聲言不再開發傳統
軟體。
總之
ASP,PHP,JSP三者都有相當數量的支持者,由此也可以看出三者各有所長。正在學習或
使用動態頁面的朋友可根據三者的特點選擇一種適合自己的語言。
另外還有 aspx , do ,CGi 等後綴的動態語言。。
⑶ 軟體包分類
在Linux和BSD系統中,軟體包的兩種主要形式是二進制包和源代碼包。二進制包類型有rpm、deb和Autopackage,適用於已編譯的軟體安裝。源代碼包則主要適用於自由軟體,用戶需要自行編譯。在Windows系統中,軟體包以安裝程序為主,如IBM Tivoli Access Manager for Operating Systems,它包含了針對多個平台的多個版本,如AIX、Solaris、HP-UX、Linux(xSeries、zSeries、pSeries和iSeries)以及Windows NT、Windows XP、2000和2003。這些軟體包包含了基礎版本(Base)、目錄伺服器、Web管理界面和WebSphere Fix Pack等,每種都有對應的5.1版本。此外,還提供針對不同操作系統的語言支持。總的來說,每個操作系統都有其特定的軟體包組合,以便用戶根據需要進行安裝和管理。
軟體包(SoftWare Package)是指具有特定的功能,用來完成特定任務的一個程序或一組程序。可分為應用軟體包和系統軟體包兩大類。應用軟體包與特定的應用領域有關,又可分為通用包及專用包兩類。通用軟體包根據社會的一些共同需求開發,專用軟體包則是生產者根據用戶的具體需求定製的,可以為適合其特殊需要進行修改或變更。
⑷ JBoss Web和 Tomcat的區別
JBoss Web和 Tomcat的區別
在Web2.0的浪潮中,各種頁面技術和框架不斷涌現,為伺服器端的基礎架構提出了更高的穩定性和可擴展性的要求。近年來,作為開源中間件的全 球領導者,JBoss在J2EE應用伺服器領域已成為發展最為迅速的應用伺服器。在市場佔有率和服務滿意度上取得了巨大的成功,絲毫不遜色於其它的非開源 競爭對手,如WebSphere、WebLogic、Application Server。JBoss Web的諸多優越性能,正是其廣為流行的原因。
基於Tomcat內核,青勝於藍
Tomcat 伺服器是一個免費的開放源代碼的Web 應用伺服器,技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛並得到了部分軟體開發商的認可。其運行時佔用的系統資源小,擴展性好,且支持負載平衡與郵件服務等開發應用系統常用的功能。作為一個小型的輕 量級應用伺服器,Tomcat在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,成為目前比較流行的Web 應用伺服器。
而JBoss Web採用業界最優的開源Java Web引擎, 將Java社區中下載量最大,用戶數最多,標准支持最完備的Tomcat內核作為其Servlet容器引擎,並加以審核和調優。單純的Tomcat性能有 限,在很多地方表現有欠缺,如活動連接支持、靜態內容、大文件和HTTPS等。除了性能問題,Tomcat的另一大缺點是它是一個受限的集成平台,僅能運 行Java應用程序。企業在使用時Tomcat,往往還需同時部署Apache Web Server以與之整合。此配置較為繁瑣,且不能保證性能的優越性。
JBoss在Tomcat的基礎上,對其進行本地化,將Tomcat 以內嵌的方式集成到 JBoss 中。JBoss Web通過使用APR和Tomcat本地技術的混合模型來解決Tomcat的諸多不足。混合技術模型從最新的操作系統技術里提供了最好的線程和事件處理。 結果,JBoss Web達到了可擴展性,性能參數匹配甚至超越了本地Apache HTTP伺服器或者IIS。譬如JBoss Web能夠提供資料庫連接池服務,不僅支持 JSP 等 Java 技術,同時還支持其他 Web 技術的集成,譬如 PHP、.NET 兩大陣營。
標准化是減小技術依賴風險,保護投資最好的方式。JBoss Web率先支持全系列JEE Web標准,從根本上保證了應用「一次開發,到處運行」的特點,使應用成品能方便地在JBoss Web和其他Java Web伺服器之間輕易遷移。
⑸ go安裝教程(go安裝配置)
Go語言安裝與鏡像配置安裝網址
國內鏡像
Go1.13及以上(推薦
打開你的終端並執行
macOS或Linux
或
如果是zsh
請這樣設置
Windows
打開PowerShell並執行
或者
然後你就可以
gopro8使用教程
1、拿到gopro8後,先要進行安裝電池和存儲卡;
2、將此按鈕按住,然後向外推,如圖所示:
3、先安裝電池,安裝電池時根據電池形狀將電池插進去,不要插反了;
4、安裝好電池後,再來安裝存儲卡,要將存儲卡有字的這一面對著電池;
5、注意這里有一個防水片,千萬不要弄掉了,如圖:
6、這里是開機鍵,長按住即可開機,關機時也是一樣長按住即可,如圖:
7、這里是快門鍵,按下快門鍵即可開啟攝像功能並立即開始錄制。
go安裝器怎麼用go安裝器一直顯示網路錯誤可以把GooglePlay商店的緩存和數據清除。登錄谷歌賬號,這個過程需要等待幾分鍾,登錄成功後還需要同意GooglePlay的相關協議條款,之後就可以進入到安裝谷歌框架和谷歌服務的進程中。安裝成功後就可以將谷歌安裝器卸載掉,也可以將其保留在手機中。
1.系統自身不提供root:
2.這樣的情況就需要第三方軟體來root,下面用騰訊手機管家舉例。通過數據線連接電腦進行root。
3.手機連接應用寶。成功連接之後選擇「一鍵ROOT」。
4.ROOT過程中,手機會自動重啟幾次(切記不要拔出數據線)。中途手機會提示安裝root需要的軟體,點擊安裝隨後手機會進入重啟。
5.ROOT成功。在手機的桌面里會有圖標顯示。
如何部署Golang應用如何部署Golang應用
安裝supervisord
#通過載入程式ez_setup.py來安裝。這個載入程式會聯網下載最新版本setuptools來安裝,同時也可以更新本地的setuptools。
wget:peak.telemunity./dist/ez_setup.py
sudopythonez_setup.py
#更新setuptools:
sudopythonez_setup.py-Usetuptools
#安裝supervisor
easy_installsupervisor
#生成配置檔案
echo_supervisord_conf/etc/supervisord.conf
#編輯配置檔案
vim/etc/supervisord.conf
#進入vim後找到最後兩行,開啟注釋(取消前面的分號),
#[include]
#files=supervisor.d/*.ini
#將所有的supervisor配置都放到/etc/supervisor.d目錄
mkdir/etc/supervisor.d
建立supervisor對應程式的配置檔案
其中的一些路徑需要換成自己對應的,這里將zankbo這個web應用放在了對應的使用者目錄下
通過在生產伺服器上設定environment可以在程式里判斷是線上還是開發模式,如zankbo的debug判斷
當然也可已在啟動命令處加入引數,如mand=/home/zankbo/gopath/src/zankbo/zankbo-d來關閉Debug模式。
ifos.Getenv("APP_NAME")=="ZANKBO_PRODUCT"{
beego.RunMode="prod"
}
vim/etc/supervisor.d/zankbo.ini
#寫入
[program:zankbo]
directory=/home/zankbo/gopath/src/zankbo
environment=APP_NAME="ZANKBO_PRODUCT"
mand=/home/zankbo/gopath/src/zankbo/zankbo
autostart=true
startsecs=5
user=zankbo
redirect_stderr=true
stdout_logfile=/home/zankbo/log/zankbo.log
建立對應的使用者
useraddzankbo
#將使用者加入到zankbo使用者組,Nginx以使用者執行
usermod-a-Gzankbo
#更改使用者家目錄使用者組的許可權,使Nginx可以訪問
chmodg+rx/home/zankbo
部署Go環境
其中的目錄為,go:Go安裝目錄gopath:Go工作目錄,下面有src、pkg、bin三個目錄log:日誌資料夾
[zankbo@MyCloudServer~]$pwd
/home/zankbo
[zankbo@MyCloudServer~]$vim.bashrc
#設定Go環境變數,在.bashrc檔案末尾寫下如下內容
exportGOROOT=$HOME/go
exportGOPATH=$HOME/gopath
exportPATH=$PATH:$GOROOT/bin:$GOPATH/bi
#切換到使用者家目錄
[root@MyCloudServer~]#su-zankbo
[zankbo@MyCloudServer~]$ls
gogopathlog
將專案程式碼放到gopath/src下面,如我的播客專案:
[zankbo@MyCloudServer~]$tree-L2gopath/src/
gopath/src/
├──github.
│├──astaxie
│├──beego
│├──go-sql-driver
│├──howeyc
│├──jacobsa
│├──***artystreets
│└──wendal
└──zankbo
├──admin
├──blog
├──build_pkg.sh
├──mon
├──conf
├──controllers
├──dbstruct.mwb
├──main.go
├──models
├──static
├──views
└──zankbo
匯入專案sql檔案到資料庫
在專案資料夾執行build
[zankbo@MyCloudServerzankbo]$pwd
/home/zankbo/gopath/src/zankbo
[zankbo@MyCloudServerzankbo]$gobuild
會在專案下生成與包名對應的可執行檔案,這里為:zankbo,build的時候可能會遇到錯誤,比如mysql的密碼之類的,可根據提示排錯。
通過supervisor來啟動服務
#supervisorctlstartzankbo
配置Nginx
server{
listen80;
server_namezankbo.zankbo.;
root/home/zankbo/gopath/src/zankbo;
error_loglogs/zankbo..error.logwarn;
location/static/{
root/home/zankbo/gopath/src/zankbo;
location~.*.(js|css)${
aess_logoff;
expires1d;
}
location~.*.(gif|jpg|jpeg|png|bmp|swf)${
gzipoff;
aess_logoff;
expires3d;
}
}
location/{
proxy_pass:127.0.0.1:8080;
}
}
如何部署thinkphp應用
1、首先在官方網站下載ThinkPHP最新版本。
2、下載後的壓縮檔案解壓到WEB目錄(或者任何目錄都可以),框架的目錄結構為:
├─ThinkPHP.php框架入口檔案
├─Common框架公共檔案
├─Conf框架配置檔案
├─Extend框架擴充套件目錄
├─Lang核心語言包目錄
├─Lib核心類庫目錄
│├─Behavior核心行為類庫
│├─Core核心基類庫
│├─Driver內建驅動
││├─Cache內建快取驅動
││├─Db內建資料庫驅動
││├─TagLib內建標簽驅動
││└─Template內建模板引擎驅動
│└─Template內建模板引擎
└─Tpl系統模板目錄
注意,框架的公共入口檔案ThinkPHP.php是不能直接執行的,該檔案只能在專案入口檔案中呼叫才能正常執行,這是很多新手很容易犯的一個錯誤。
3、接下來先在WEB根目錄下面建立一個app子目錄(這個就是app就是專案名),然後在該目錄下面建立一個index.php檔案,新增一行簡單的程式碼:
require'/ThinkPHP框架所在目錄/ThinkPHP.php'
這行程式碼的作用就是載入ThinkPHP框架的入口檔案ThinkPHP.php,這是所有基於ThinkPHP開發應用的第一步。然後,在瀏覽器中訪問這個入口檔案。
如何部署應用到was上
websphere的預設使用記憶體應該是256的你的38的war包部署不應該出現記憶體崩掉的問題呀。
部署系統也很簡單么,就是打成war包,記得打war包得時候要檢查web.xml的格式websphere很在意這個東東的。
然後一步一步的部署就可以了。was慢但是不會你那麼慢得。可以貼error出來看看
如何部署python3的應用
mod_python,這是apache內建的模組,很嚴重的依賴於mod_python編譯使用的python版本,和apache配套使用,不推薦
cgi,這個太old,不推薦,而且nginx不支援cgi方式,只能用ligd或者apache
fastcgi,這個是目前流行最廣的做法,通過flup模組來支援的,在nginx里對應的配置指令是fastcgi_pass
spawn-fcgi,這個是fastcgi多程序管理程式,ligd安裝包附帶的,和
flup效果一樣,區別是flup是
python程式碼級引入,spawn-fcgi是外部程式。spawn-fcgi用途很廣,可以支援任意語言開發的代
碼,php,python,perl,只要你程式碼實現了fastcgi介面,它都可以幫你管理你的程序
scgi,全名是SimpleCommonGatewayInterface,也是cgi的替代版本,scgi協議很簡單,我覺得和fastcgi差不多,只是沒有怎麼推廣開來,nginx對應的配置指令是scgi_pass,你想用就用,flup也支援。
,nginx使用proxy_pass轉發,這個要求後端appplication必須內建一個能處理高並發的server,在python的web框架當中,只能選擇tornado.
python程式設計師喜歡發明輪子,tornado除了是一個webframework之外,它還可以單獨提供高效能
server,所以,如果你採用其他python框架寫程式碼,比如說bottle,也一樣可以通過import
tornado來啟動一個高效能的
server,同樣的可以採用協議和nginx一起來部署。擴充套件開來,python包裡面能處理高並發的
server還有很多,比如說gevent,也可以被其他框架引用來支援方式部署。
現實當中,用java來做web程式,通常就用和nginx配合,應用伺服器選擇tomcat或者jetty
uwsgi,包括4部分組成,
nginx從0.8.4開始內建支援uwsgi協議,uwsgi協議非常簡單,一個4個位元組header+一個body,body可以是很多協議的
包,比如說,cgi等(通過header裡面欄位標示),我曾經做個一個小規模的效能對比測試,結果表明,uwsgi和fastcgi相比,效能
沒有太明顯的優勢,也可能是資料集較小的原因
uwsgi的特點在於自帶的程序控製程式.它是用c語言編寫,使用natvie函式,其實和spawn-fcgi/php-fpm類似。所以uwsgi可以支援多種應用框架,包括(python,lua,ruby,erlang,go)等等
uwsgi協議
webserver內建支援協議模組
application伺服器協議支援模組
程序控製程式
Gunicorn,和uwsgi類似的工具,從rails的部署工具(Unicorn)移植過來的。但是它使用的協議是WSGI,全稱是,這是python2.5時定義的官方標准(PEP333),根紅苗正,而且部署比較簡單,:gunicorn./上有詳細教程
mod_wsgi,apache的一個mole,也是支援WSGI協議,:code.google./p/modwsgi/
如何部署簡單python+flask應用
python是一款應用非常廣泛的指令碼程式語言,谷歌公司的網頁就是用python編寫。python在生物資訊、統計、網頁製作、計算等多個領域都體現出了強大的功能。python和其他指令碼語言如java、R、Perl一樣,都可以直接在命令列里執行指令碼程式。
所需工具:
python3.4
flask
nginx
gunicorn
supervisor
系統環境:
Ubuntu14.04LTS
我們先寫一個最基本的flask應用:
demo.py
fromflaskimportFlask
app=Flask(**name**)
@app.route('')
defindex():
return'HelloWorld.'
if__name__==__main__:
app.run()
執行這個py檔案,開啟瀏覽器訪問127.0.0.1:5000就能看到顯示HelloWorld的頁面.
如果讓這個flask引用監聽來自公網ip的請求,理論上你跑此程式的機器就相當於一個伺服器了,然而這個伺服器並不完美,所以我們需要nginx和gunicorn來增加它的功能,讓它真刀真槍上生產環境的時候能按要求執行。
flask自帶的WSGI框架效能很差勁,只能適用於開發環境除錯使用。我們用專業一點的gunicorn(還有很多其他優秀的框架)替代flask自帶的WSGI框架。
配置完後,通過命令』/usr/local/bin/gunicorn-b127.0.0.1:5000『啟動應用。開啟瀏覽器訪問127.0.0.1:5000,同樣能夠得到返回頁面
然而gunicorn也僅僅是一個python的WSGI框架而已,要讓它真正處理來自網際網路的各類訪問功能還是有點欠缺,這時候就需要用到大名鼎鼎的nginx伺服器來替gunicorn遮風擋雨了。
Ubuntu下安裝nginx可以用命令
sudoapt-getinstallnginx
安裝後需要進行下配置:
cd/etc/nginx/sites-available
sudovitest(test為配置名稱,可以根據自己專案進行命名)
test檔案的配置為:
server{
listen80;#監聽80埠
location/{
proxy_pass:127.0.0.1:5000;#代理本機127.0.0.1:5000的服務
}
location/static{
alias/home/ubuntu/myproject/myblog/app/static;#負載均衡
}
}
cd..
cdsites-enable
sudoln-s../sites-available/lwhile.(建立軟連結,別漏掉最後的.)
sudoservicenginxreload
sudoservicenginxrestart
這樣nginx的基本配置檔案就寫好了接下來我們配置程序管理工具supervisorsupervisor可以在後面啟動你的python程序,這樣很方便
1.cd/etc/supervisor/conf.d
2.sudovitest.conf(test為檔名)
[program:test]
mand=/usr/local/bin/gunicorn-b127.0.0.1:5000/home/ubuntu/myproject/test.py
3.sudosupervisorctl
4.reload
5.starttest
如果一切正常,做完這所有步驟之後,現在公網的ip訪問你的主機,就可以開啟你的flask應用了
python是一款應用非常廣泛的指令碼程式語言,谷歌公司的網頁就是用python編寫。python在生物資訊、統計、網頁製作、計算等多個領域都體現出了強大的功能。python和其他指令碼語言如java、R、Perl一樣,都可以直接在命令列里執行指令碼程式。工具/原料
python;CMD命令列;windows作業系統
方法/步驟
1、首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由於3.0版本以上不向下相容,體驗較差。
2、開啟文字編輯器,推薦editplus,notepad等,將檔案儲存成.py格式,editplus和notepad支援識別python語法。
指令碼第一行一定要寫上#!usr/bin/python
表示該指令碼檔案是可執行python指令碼
如果python目錄不在usr/bin目錄下,則替換成當前python執行程式的目錄。
3、編寫完指令碼之後注意除錯、可以直接用editplus除錯。除錯方法可自行網路。指令碼寫完之後,開啟CMD命令列,前提是python已經被加入到環境變數中,如果沒有加入到環境變數,請網路
4、在CMD命令列中,輸入「python」+「空格」,即」python「;將已經寫好的指令碼檔案拖拽到當前游標位置,然後敲回車執行即可。
如何安裝Go語言安裝包go語言作為google的一個主推語言,最近很多人都在研究,也花了一點時間對他的安裝進行了測試,本人使用SublimeText2+GoSublime+gocode
顧名思義首先是安裝Go,這里有很詳細的安裝說明,或者(golang.org自己去找hosts),官方已經支持Windows版本
下載解壓配置環境變數
「環境變數」(我的電腦-高級系統設置-環境變數),在系統變數的標簽下,依次新建編輯如下幾個鍵值對:
(1).新建變數名:GOBIN變數值:c:goin
(2).新建變數名:GOARCH變數值:386
(3).新建變數名:GOOS變數值:windows
(4).新建變數名:GOROOT變數值:c:go
(5).編輯Path在Path的變數值的最後加上%GOBIN%
1.下載SublimeText2,地址如下:
2.解壓以後,雙擊sublime_text,就可以使用SublimeText2了。
破解:
用WinHex編輯sublime_text_backup.exe文件,跳到000CBB70那一行,將該行的8AC3修改為B001然後保存
破解注冊成功
3.安裝PackageControl,在打開SublimeText2以後,按下快捷鍵Ctrl+`,打開命令窗行(具體在view——showConsole),並回車:
importurllib2,os;pf=』PackageControl.sublime-package』;ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),』wb』).write(urllib2.urlopen(『』+pf.replace(『『,』%20′)).read());print『』
4.重啟SublimeText2後,就可以發現在Preferences菜單下,多出一個菜單項PackageControl。
5.現在安裝GoSublime插件了,按住Ctrl+Shilft+p會彈出一個對話框輸入install回車彈出一個安裝包的對話框
同上輸入GoSublime選擇GoSublime回車
本機已經安裝所以