像一顆晨土

          常用鏈接

          統計

          blogs

          life

          最新評論

          關于DWR與Servlet、安全

          使用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 (Stringsession.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。至此,嘗試成功!

          posted on 2006-05-10 01:18 艾塵 閱讀(3943) 評論(7)  編輯  收藏 所屬分類: ajax

          評論

          # re: 關于DWR與Servlet、安全 2006-05-10 08:24 原創專欄 開源學習

          關于安全:
          http://getahead.ltd.uk/dwr/changelog/dwr20m1
          We take security very seriously. DWR 1.x has proved to be very secure so far, but that does not mean we rest on our laurels. DWR 2.0 introduces a lot of new code. Reverse ajax and script based session management are places where we could easily slip up.

          如果用dwr1.1,你可以繼承uk.ltd.getahead.dwr.DWRServlet,加session判斷

          這是以前寫的一篇筆記.
          http://www.aygfsteel.com/zkjbeyond/archive/2006/03/23/37029.html  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2006-05-10 10:33 艾塵

          的確,上面的示例還是在1.1的基礎上做的,不知2.0的用法是怎樣了。另外,我用的方法一部分原因是不想直接使用DWR的API。其實繼承DWRServlet是個比較方便的辦法。:P  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2006-05-10 10:46 huang2001net@21cn.com

          你的業務代碼被web層污染了,跟一個web層的action有什么區別?  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2006-05-10 10:51 艾塵

          差不多。呵。目前我的想法是這樣,是在真正的服務之前加上一些攔截器,實際上被Web層的API污染的不是服務,而是這些增加的東西。但又不能等同于Web層的Action,看起來更像Filter。Action的東西放到客戶端去做了。
          如果有更好的做法,講一定要不吝賜教。:)  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2006-05-17 17:45 FuCheng

          我覺得還是AOP來的好,畢竟安全驗證這些東西都是crosscutting concerns  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2006-12-07 18:41 wangpeng

          你好,我有個類似的問題想請教.我做的是一個聲明的日志記錄模塊,用的是方法攔截器,攔截的是service,但是我現在取不到session,請問有什么方法能在我的方法攔截器中取到,還是有其他可以解決的方法?謝謝了.我的E-MAIL:wpmaomao@126.com  回復  更多評論   

          # re: 關于DWR與Servlet、安全 2007-07-10 14:04 wangpengfei

          一般的話都是在ACTION中級別配置攔截器,只要把servlet包導入
          通過ServletActionContext.getRequest().getSession()很容易得到  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 乐至县| 江安县| 靖边县| 南平市| 磐石市| 阳朔县| 大石桥市| 云南省| 黑龙江省| 全州县| 商丘市| 竹山县| 崇明县| 句容市| 高阳县| 波密县| 临桂县| 瓦房店市| 长阳| 天门市| 七台河市| 平乡县| 新丰县| 土默特左旗| 罗平县| 交口县| 辉县市| 同仁县| 兰坪| 登封市| 乐山市| 万山特区| 朝阳县| 葫芦岛市| 缙云县| 蓬莱市| 射阳县| 张家港市| 延寿县| 深水埗区| 娄烦县|