Struts1.X是单例的,那么模拟一个业务场景是:向数据库记录一个登陆用户的信息,需要用到From缓存,多个浏览器同时访问Action的保存用户信息的方法,因为是单例的,所以共用一个Form,会不会造成数据覆盖?如果会覆盖,即使单例有一定的好处,但安全上存在这么大的问题,为什么还要使用这种实现方式或者有其什么对应措施?

解决方案 »

  1.   

    Struts1.X是单例的,但是表单的值是通过参数从ActionForm传入的,如下面的form,每个请求的产生的form是不同的,怎么可能相互覆盖呢?execute(ActionMapping mapping, ActionForm form,   
    ServletRequest request, ServletResponse response) 主要是注意在Struts1的ACTION中不要使用成员变量,如果这样此成员变量会被多个线程共享,有线程安全问题。STRUTS2的ACTION已经不再是单例的,所以表单的值是通过ACTION的成员变量来传递的,这是STRUTS1和STRUTS2的主要区别之一。
      

  2.   

    谢谢您的回答,而且答案也表示十分同意,不过有两点我比较模糊,就是:
    1、Http向ActionServlet发送一个请求,ActionServlet会根据Action标签中是否配置了form属性,如果有则在当前会话中查看是否已经有该From的实例,如果没有则new一个返回,如果有则直接拿来用。如果该Action的会话范围设置为Session,那这个Form不是同一个吗,这样是不是就有覆盖现象了?
    2、在excute方法中定义一个int的局部变量,并在代码中多次用到,并发访问下,这个int的变量不会相互覆盖吗?
      

  3.   

    1  这个会话 应该是request 。
    2  方法是Thread 独享的,也就意味着线程调用方法时的局部变量(不是全局变量)也是唯一的。