哥需要趁熱打鐵,被一個(gè)md5加密的問題弄得幾天沒休息好,現(xiàn)在說下事情來由,如果不愿意看我這些問題發(fā)生的經(jīng)過,可以直接跳到最后面的解決方法閱讀:
項(xiàng)目?jī)?nèi)容分析:我們公司網(wǎng)站和KU6網(wǎng)合作,使用ku6網(wǎng)的一個(gè)上傳視頻的OPEN API接口。這個(gè)URL接口鏈接有授權(quán)用戶名、密碼、版本號(hào)、視頻標(biāo)題、視頻描述、視頻標(biāo)簽等參數(shù),還有最重要的一個(gè)參數(shù),是通過這些鏈接參數(shù)進(jìn)行MD5加密而得到的。
項(xiàng)目語言:我們公司基于JAVA,KU6的接口基于PHP
實(shí)現(xiàn)上傳的原理:上傳成功的原理比較簡(jiǎn)單,我們網(wǎng)站生成的MD5,和KU6網(wǎng)接口生成的MD5進(jìn)行匹配就行了。也就是說,除了&md5=這個(gè)參數(shù)以外,其它的參數(shù)必須是一致,因?yàn)槭峭ㄟ^form的post提交,所以中文字符可以不用進(jìn)行編碼,直接進(jìn)入程序進(jìn)行加密提交并返回上傳成功的結(jié)果。
出現(xiàn)問題了:但是不管如何都是返回了一個(gè)md5編碼的錯(cuò)誤信息(這個(gè)那個(gè)API接口的一個(gè)錯(cuò)誤提示),這個(gè)問題一直和KU6方提出求援,但是還是沒得到很好的幫助,因項(xiàng)目很緊急,而且這個(gè)問題浪費(fèi)了我兩三天的時(shí)間,最后和老大們討論了一下,會(huì)不會(huì)是java和php的MD5加密方式不一樣導(dǎo)致的?最后經(jīng)過了測(cè)試,對(duì)于英文和數(shù)字的參數(shù),java和php的MD5加密返回結(jié)果是一樣的,但是中文加密后就不一樣了。
解決思路: 1、重寫一個(gè)java版的php MD5加密方法,這個(gè)是不太可能的,因?yàn)橐馁M(fèi)太多時(shí)間。(失敗告終) 2、上網(wǎng)找解決方案,很難找,找了很多java的md5中文加密都不能夠返回一個(gè)和php的md5中文加密相同的示例。(失敗告終)
解決方式: 很懊惱中,突然靈光一閃,我能否直接用php的md5方法加密后,把返回的結(jié)果傳到JAVA代碼里面去呢??我立即按照這個(gè)思路去做: 1、搭建好php的環(huán)境(不作介紹),寫一個(gè)通過提取get參數(shù),并對(duì)值進(jìn)行md5加密的頁面,如下 <?php echo strtoupper(md5($_GET["md5str"])); ?> strtoupper是字母大寫轉(zhuǎn)換的函數(shù) md5是MD5加密的函數(shù) $_GET["md5str"]就是通過url帶一個(gè)md5str的參數(shù),把值獲取并打印出來
2、JAVA頁面的提交方法
Java代碼
需要提示的是,url記得先對(duì)中文參數(shù)進(jìn)行一次UTF-8的編碼再傳到這個(gè)方法里面,這個(gè)方法對(duì)響應(yīng)的結(jié)果做了反編碼的處理,最后就能正確的返回php MD5加密后的值了!
總結(jié):最終問題是以這種投機(jī)取巧的方式解決的。這要根據(jù)實(shí)際情況去使用,有些網(wǎng)站項(xiàng)目不一定php和jsp的環(huán)境都會(huì)共存,還要考慮到一個(gè)維護(hù)性的問題,最好在java處理這部分功能的代碼上加上注釋和文檔,以便日后維護(hù)!完了,晚安??! Java的MD5本來加密出來的就是字節(jié)流,只不過是為了閱讀方便又包裝了一層轉(zhuǎn)為字符串。。 |
|