• 近期总结 - [自写]

    2008-05-11

    有好些日子没有写Blog了,奥运越来越近,工作是越来越忙了,呵呵。

    最近主要是在搞公司的工作, 抽空把Scala研究了一下。

    用Scala写了一些程序,因为还不熟悉,所以经常要查文档,看资料。

    着重研究了一下Scala的Actor用法,在此推荐两篇论文: 

    Event-Based Programming without Inversion of Control 和  Actors that Unify Threads and Events,

    这两个论文都是在Actor 的API中引用的。

    Sala的Actor即有Erlang中轻量级Process的优势,又可以直接当作本地线程使用。

    我总结了一下,对于Actor的使用,基本上可以根据任务的特点来决定使用哪种了:

    1.cpu相关的

    对于这种任务,无论是Erlang的Process,还是Scala的Actor都可以支持得很好,Scala的实现是用一个线程池来执行Actor,它可以根据cpu的个数决定线程池中工作线程的个数,同时根据任务的个数,适时的调整这工作线程的个数。

    写法在Scala的例子中有很多,类似如下: 

    loop {      react {  ........           }  } 



    2.io相关的

    这种任务主要的工作不在cpu,而在IO操作上,比如读写Socke等,类似这种操作的时候,最好使用Actor的线程特性,也就是在ract的时候,根据参数新创建一个Actor来执行和IO相关的任务,下面的“主Actor”的任务是接收消息,每收到一个消息就启动一个Actor去请求页面的内容,然后再做相关的处理,这也是Actors that Unify Threads and Events 里所主要表达的内容。

    loop {  
        react {  
           case url:String =>
              actor{
                 //由个新建的actor执行IO操作,避免阻塞后续的其它的请求
                  val response = HttpUtil.get(url) 
             }          
     }  
    } 

    用Scala写并发方面的程序要比Java来得容易,Actor的使用要小心一些,否则不小心就搞出一个“串行”来,呵呵。

    说说Struts2吧, 

     很久没有用过Struts2之类的Web框架了,最近在用Struts2,开始是同事基本上把环境都搭好了,我只需要下载更新后,按步就班地开发就好了。昨天需要我从开始弄一个应用,那就一个背。照猫画虎地把应用弄起来,写action,写jsp,还算顺利。这时发现了一个问题,因为我用的了所谓的"模型驱动"这种参数注入方式,OGNL以前也用过,它可以根据表达来给Action中的对象属性设置由页面中传入的参数。

    private Sample sample;

    public void setSample(Sample sample){

    this.sample = sample;

    }

    有了上面这段代码,OGNL就能自动地把提交的参数设置到sample这个对象的属性中,比如sample.user.

    这就让我产生了一个疑问,如果用户知道我们的Action中的其它setter方法,那会不会受到”攻击“呢。

    我试了一下,  

    private OwnSample ownSample;

    public void setOwnSample(OwnSample sample){

    this.OwnSample = sample;

    }

     假设用户知道有这么一个属性可以用,那种他在发送请求的时候会加上一个ownSample.id=XX之类的参数,就会造成OGNL首先会生成一个OwnSample对象,然后设置属性,然后调用 setOwnSample设置给Action中。如果这个参数是使用其它的途径注入,如用Spring,那用户设置的参数会被覆盖掉(在这种情况下也是有害的,因为无谓地多生成了一次对象,还要看创建对象的代价大小,如果是那种比较费时的创建那就惨了),反之用户的参数就会生效了。

    虽然是内部使用的程序,我觉得还是能避免这种问题最好,找了一下API,发现可以定义一个acceptableParameterName的方法来过滤一下参数就保险了。

    类似的问题还有Struts2在配置文件中定义Action的时候,支持通配符,例如:

    <action name="user_*" class="com.UserAction" method="{1}">

    这种配置我觉得也是有风险的,如果UserAction里有一个一般用户都不知道的方法,那么如果被猜出来,或者被“离职的职员”恶意访问,问题就大了,除非对这种方法有额外的权限检查。

    所以如果有这种问题,还是勤快点儿,尽量少用通配符的好,呵呵。

    这两个问题是我正经用了两天Struts2之后感觉不太对的地方,写出来,也可能有更好的解决办法,供大家留意一下。

    多说一句,现在的各种框架的Demo 或者样例一般是怎么简单怎么来,让人一看就觉得这太简单了,太好用了,省得我老得request.getParameter一个一个的把参数凑整齐再用,这么用多方便。我们还是小心点好,Demo中的例子,不一定在生产环境中靠谱,还需要我们自己推敲一下。:)

     


    收藏到:Del.icio.us




发表评论

您将收到博主的回复邮件
记住我