像一颗晨土

常用链接

统计

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 艾尘 阅读(3924) 评论(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.blogjava.net/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++博客   博问