转:
【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)
-
-
-
-
-
<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
首先我们需要注意的就是类中变量不能public,这本来就不符合java的编程规范,封装性因为public修饰变量名完全被破坏了。另外关于方法的使用限制。我们在dwr.xml可以这样写:
-
-
-
-
-
<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的时候感觉没那么难呢?“ 我想说这个也要分情况的,不同人不同场合不同情况也会有不同工作效率的。还有就是方法问题了。分步骤,逐步测试,等等各种方法,很多经验都是需要长时间慢慢积累的。
总算完成了,喜欢的话希望读者点个赞吧,感谢阅读!