zoukankan      html  css  js  c++  java
  • dwr框架介绍

    转:

    【DWR框架】过时了吗?

    版权声明: https://blog.csdn.net/smileyan9/article/details/80545795

    对于这个问题,一般态度有三种:

    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中,这个地方不需要考虑安全问题,因为跟外界无任何交互,所有类似的框架都需要在这里写导入配置。

    1. <servlet>
    2. <display-name>DWR Servlet</display-name>
    3. <servlet-name>dwr-invoker</servlet-name>
    4. <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    5. <init-param>
    6. <param-name>debug</param-name>
    7. <param-value>true</param-value>
    8. </init-param>
    9. </servlet>
    10.  
    11. <servlet-mapping>
    12. <servlet-name>dwr-invoker</servlet-name>
    13. <url-pattern>/dwr/*</url-pattern>
    14. </servlet-mapping>

            这个内容是“将java代码开放给其他人访问“的配置(也就是dwr.xml)

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
    3.  
    4.  
    5. <dwr>
    6. <allow>
    7. <create creator="new" javascript="Demo" scope="application">
    8. <param name="class" value="cn.smileyan.cy.Cyservice"/>
    9. </create>
    10. </allow>
    11. </dwr>

        也就是说,这个的作用就是将cn.smileyan.cy.Cyservice这个类开放给外界访问,也就是说,我们可以在前端代码中通过这种方式访问这个类中的public方法,public变量。是不是很危险呢?就是有种将自己后台隐私公之于众的感觉?

          其实对于这个问题官网上有说过解决方法。网址如下:

            http://directwebremoting.org/dwr/security/script-tag-protection.html

          首先我们需要注意的就是类中变量不能public,这本来就不符合java的编程规范,封装性因为public修饰变量名完全被破坏了。另外关于方法的使用限制。我们在dwr.xml可以这样写:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">
    3.  
    4.  
    5. <dwr>
    6. <allow>
    7. <create creator="new" javascript="Demo" scope="application">
    8. <include method="test"/>
    9. <param name="class" value="cn.smileyan.cy.Cyservice"/>
    10. </create>
    11. </allow>
    12. </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的时候感觉没那么难呢?“ 我想说这个也要分情况的,不同人不同场合不同情况也会有不同工作效率的。还有就是方法问题了。分步骤,逐步测试,等等各种方法,很多经验都是需要长时间慢慢积累的。

    总算完成了,喜欢的话希望读者点个赞吧,感谢阅读!

  • 相关阅读:
    数组的学习(一)
    Servlet是线程安全吗?
    MySql用户管理:添加用户、授权、删除用户
    泛型(二)
    泛型(一)
    Spring MVC
    spring框架
    mybatis基础
    Hibernate 基础
    Java局部类
  • 原文地址:https://www.cnblogs.com/libin6505/p/10464132.html
Copyright © 2011-2022 走看看