【DWR框架】過時了嗎?
對於這個問題,一般態度有三種:
1. 當然過時了,Ajax我們可以使用jQuery很容易就可以實現,何必使用DWR這個需要配置,需要擔心java程式碼洩露的危險的。
2. 當然沒有過時,現在仍然有不少專案需要這個框架來實現一些效果,怎麼說也是一個很不錯的框架,使用方便,能夠適應各種框架中。
3. 不好說。
對於這個問題我們不急於立即得到答案,我們可以看一下這個論壇https://bbs.csdn.net/topics/390981028,總結以下發帖者的觀點如下: 1. DWR框架笨重,使用不便(使用時常常各種報錯)。2.DWR框架只是用於實現Ajax。3.DWR框架有程式碼入侵的危險。
這個問題也應該是很多人關注的問題,我們慢慢回答。
首先,最需要回答的應該是程式碼入侵的問題。為什麼會擔心這個問題呢?我們可以從DWR的配置過程中找到答案,下面內容是DWR配置過程(以Servlet為例,Struts,Spring等類似)
這個內容是載入DWR框架,寫在web.xml中,這個地方不需要考慮安全問題,因為跟外界無任何互動,所有類似的框架都需要在這裡寫匯入配置。
<servlet> <display-name>DWR Servlet</display-name> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
這個內容是“將java程式碼開放給其他人訪問“的配置(也就是dwr.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"> <dwr> <allow> <create creator="new" javascript="Demo" scope="application"> <param name="class" value="cn.smileyan.cy.Cyservice"/> </create> </allow> </dwr>
也就是說,這個的作用就是將cn.smileyan.cy.Cyservice這個類開放給外界訪問,也就是說,我們可以在前端程式碼中通過這種方式訪問這個類中的public方法,public變數。是不是很危險呢?就是有種將自己後臺隱私公之於眾的感覺?
其實對於這個問題官網上有說過解決方法。網址如下:
http://directwebremoting.org/dwr/security/script-tag-protection.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="Demo" scope="application">
<include method="test"/>
<param name="class" value="cn.smileyan.cy.Cyservice"/>
</create>
</allow>
</dwr>
跟之前的不同在於<include>標籤,也就是說外界訪問的時候,這個類中所有方法只能訪問這個test方法。這樣做是不是感覺好多呢?所有的類中變數要用private修飾,提供給外界訪問的方法事先配置好。
至於其他方式的攻擊手段以及保護方法請閱讀上面提供的官網介紹。
目前我們已經能夠比較好的解決了這個問題了,如果還要要求苛刻的話也是不可能的,就算使用jQuery也同樣需要指定URL然後再使用get或是post方法,比如說Servlet與jQuery結合使用,jQuery也是訪問servlet的路徑然後進行操作,而DWR框架的好處也是如此,Servlet的訪問路徑是在web.xml中配置的(註解的方式也是如此),而DWR框架中設定的訪問路徑是在dwr.xml中配置的。想訪問Servlet類中的其他變數是不可能的,因為jQuery只能訪問Servlet輸出內容,從而實現了安全性。而dwr也是如此,只能訪問實現配置好的方法,如果事先配置好的方法裡面有return什麼的話,也就可以拿到後臺資料。其他內容通過配置同樣對jQuery是不可見的。
問題應該解決得差不多了吧?
其次我們說說“不就是Ajax嗎,jQuery就能實現”這個問題。
說實話這個未免理解有點不到位,DWR的宣傳語是 “ Easy Ajax For Java”,或者說總體介紹是這樣的,但是它原本不止如此的。當然,如果想實現我那個Ajax例子當然不要使用DWR這個框架,因為相對於jQuery來說太麻煩了。
但是jQuery實現後臺推送應該如何完成呢?Ajax有一個很大的缺陷就是“無法滿足傳統桌面系統的需求——伺服器端需要向客戶端主動傳送訊息”。服務端推送技術的應用場景有很多,這個地方不多介紹。
DWR框架是可以完成這個的。也就是說,這個時候我們就可以發現DWR框架不只是"Easy Ajax For Java"了。
這個回答能不能反駁那個觀點呢?這裡提供一個DWR官網例子,大家可以嘗試玩一下,最好是開啟兩個或兩個以上瀏覽器,然後嘗試聊天。但這個例子不是很好的例子,但不管怎麼說也是後臺推送的一個例子。網址如下:https://www.smileyan.cn/dwrdemo/reverseajax/java-chat.html
效果如下:
強調一下這個例子的玩法:首先用電腦開啟這個網址,然後用手機瀏覽器進入這個網址並且輸入資訊回車,然後可以發現自己電腦上已經輸出了手機上輸入的內容。這個就是一個後臺推送的例子。
最後一個問題就是DWR笨重,配置不便的問題
配置遇到問題我也是遇到過,不過那是在第一次使用此框架的時候。就像我第一次使用struts2,使用Hibernate,和使用Spring框架一樣。尤其是在配置SSH框架的時候,三個框架愛整合花了我相當多的時間。
框架都有一個通病,就是需要配置,而且配置都不會像我們配置Servlet一樣簡單。但是我們卻要從Servlet過渡到Struts,從簡單的JDBC可以實現,到使用Hibernate,從無Spring到使用Spring,因為這些框架可以解決很多問題,所以我們要不怕麻煩的配置它,越是功能強大的框架配置越麻煩。
當然,又有人會說,“為什麼我配置spring的時候感覺沒那麼難呢?“ 我想說這個也要分情況的,不同人不同場合不同情況也會有不同工作效率的。還有就是方法問題了。分步驟,逐步測試,等等各種方法,很多經驗都是需要長時間慢慢積累的。
總算完成了,喜歡的話希望讀者點個贊吧,感謝閱讀!