1. 程式人生 > >【DWR框架】過時了嗎?

【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的時候感覺沒那麼難呢?“ 我想說這個也要分情況的,不同人不同場合不同情況也會有不同工作效率的。還有就是方法問題了。分步驟,逐步測試,等等各種方法,很多經驗都是需要長時間慢慢積累的。

總算完成了,喜歡的話希望讀者點個贊吧,感謝閱讀!