使用DWR做Remote,完全繞過傳統的MVC框架,如Struts、Webwork,單用一個DWRServlet來做控制器。DWR向客戶端 暴露了服務端的服務接口,很有可能有沒有任何限制的情況下被客戶端調用所暴露的接口。如果使用傳統的MVC框架,可以很方便地解決很多問題諸如身份驗證、 權限控制等。而DWR提供的功能是給客戶端暴露服務接口。上面所涉及的問題卻少有牽涉。不過,解決方案還是有的。其中之一就是使用AOP,自已實現一些攔 截功能,例如結合Spring,使用DWR的Spring整合功能,給客戶端提供一個Spring的Bean,而這個Bean是經過代理的 (Proxy)。實際上已經保證了身份認證等動作完成了。而我們要多做的是,寫一些Spring的Bean來作攔截器。再在原有的服務上再加上一些 AOP。當然,DWR對于安全的還是提供了些設施的,基于J2EE的安全策略之上。感覺不是十分良好,所以沒用,也沒深入研究。:P
很多時候,在做身份驗證及授權的時候可能會用到應用的環境,如ServletContext,Session等。那么在DWR中的服務或攔截器需要用到Session這些東西的時候,獲取是一件很簡單的事。通常有兩個辦法
一、使用DWR的API。其實是一個靜態的方法,極其不推薦。所以示例也就免了。
二、讓DWR自已注入需要的元素,這里講的元素僅限于:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- ServletContext
- ServletConfig
做法是在服務里定義方法的時候,把以上的元素作為參數。在方法體內直接使用即可。而不必擔心它的來源,來源是DWR會自已根據參數的類型注入。在客戶端調 用的時候不需要提供這個參數。ServletContext之類的東西作為ThreadLocal的變量保存起來的。簡單的示例。
1、服務代碼
package net.jf.ajax.session;
import javax.servlet.http.HttpSession;
public class Store {
public void setAttribute(String name,String value,HttpSession session){
session.setAttribute(name,value);
}
public String getAttribute(String name,HttpSession session){
return (String) session.getAttribute(name);
}
}
2、spring配置文件
<beans>
<bean id="store" class="net.jf.ajax.session.Store">
</bean>
</beans>
3、dwr.xml
<dwr>
<allow>
<create creator="spring" javascript="store">
<param name="beanName" value="store"/>
</create>
</allow>
</dwr>
以 上的代碼及配置文件可以達到目的:DWR與Spring結合,DWR直接使用Spring管理的Bean作為服務,當然,受Spring管理的Bean功 能一點都不減,復雜的如有著事務管理的Bean同樣有用。 而且盡管是Spring管理的Bean,方法的參數中有Servlet相關的參數,DWR同樣自動注入。
現在去調試頁面看看我們暴露的接口及效果如何!在調試頁面找到store的服務,點擊進去,可以見到暴露的方法有兩個:

一個是SetAttribute("","",AUTO),第三個參數表明自動注入,客戶端只需要提供前兩個參數即可。
一個是GetAttribute(“”,AUTO),第二個參數表明自動注入,客戶只需要提供一個名字參數取值即可。
在測試頁面提供的輸入框中測試兩個函數,SetAttribute填入name,jeff提交成功,在GetAttribute函數中填入name獲得一個返回值,正是jeff。至此,嘗試成功!