`

由Spring管理的Struts2的Action的全程安全问题

阅读更多

Struts2的Action的线程安全问题

 

背景 :


1) Struts2 默认会对每一个请求,产生一个新的Action的实例来处理.

2) Spring的Ioc容器管理的bean默认是单实例的.


当Struts2与Spring整合后,由Spring来管理Struts2的Action,会遇到什么问题 ?如何解决 ?

----------------------------------------------------------------

会遇到什么问题?


Struts2与Spring整合后, 由spring来管理Struts2的Action,   bean默认是单实例有情况下,会有如下问题:

1) Struts2的Action是单例,其中的FieldError,actionerror中的错误信息会累加, 即使再次输入了正确的信息,也过不了验证.

2) Struts2的Action是有状态的,他有自己的成员属性, 所以在多线程下,会有线程安全问题,这是最大的问题。


----------------------------------------------------------------

如何解决?


方案一: 就是不用单例, spring中bean的作用域设为prototype,每个请求对应一个Action实例.(建议这样做)


方案二: spring中bean的作用域设为session ,每个session对应一个实例,解决了多线程问题.

(如何设置作用域请看: 4 spring中bean的作用域 )再写一个拦截器,  清空 FieldError与actionerror

 

源自网络

public class ClearFieldErrorInterceptor extends AbstractInterceptor {

@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionSupport actionSupport = (ActionSupport)invocation.getAction();
actionSupport.clearErrorsAndMessages();
String resultCode = invocation.invoke();
return resultCode;
} 
 

-------------------------------------------------------------------------------------


总结 :

 

方案一:bean的作用域设为prototype,  不用担心性能不好, 实际测试过,多实例Action性能没问题.


方案二:  有人担心方案一性能不好, 所有才有了方案二, 不知比方案一性能 能高多少?应该不会高多少。


 


 




分享到:
评论
15 楼 grandboy 2010-01-18  
Struts1因为有ActionForm,在很多情况下可以避开多线程问题,但是 Struts2没有这个东西,直接使用Action的里的字段或者变量,如果用单例的话,Form的数据将很难封装。并且那些标签估计都不能用了吧?
14 楼 zhangjunji111 2010-01-18  
goldpicker 写道
Action不应当单例
要保存数据可以用Session或是其它持久类啊。为啥一定要保存在Action里

个人感觉Session保存太多的信息不是好事。另外, spring中bean的作用域设为prototype,每个请求对应一个实例.请求完成后,改实例会被回收,所以,不会有性能问题。

13 楼 吃猫的老鼠 2009-09-22  
2个SESSION 怕什么呢
12 楼 goldpicker 2009-09-10  
Action不应当单例
要保存数据可以用Session或是其它持久类啊。为啥一定要保存在Action里
11 楼 bryan.liu 2009-05-04  
Action单例引发的一系列问题真是弄得头疼死了,上回在一个项目里页面一直有脏数据,后来才查到是 <bean>的scope没有设,结果导致Action里面的数据一直存在,页面上的数据也都是脏数据。
如果每次都要自己去清理的话那会很累人的。而且感觉是自找麻烦。
10 楼 xujunJ2EE 2009-04-30  
slaser 写道
hantsy 写道
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。

无状态的对象单态没问题,如struts1的action,又如一般意义上的service.
另外一个方向来说,如果我的需求就是要让这个action数据全局共享,显然web框架该给我提供这个功能。
一如JSF的backed bean,Action应该可以设置作用域,决定是否可以共享。


对于你需要的数据全局共享,因为独立的提取到service层,action其实不应该作过多的业务处理
9 楼 xujunJ2EE 2009-04-30  
为什么要在spring中配置action呢???这是robbin曾经说过的 哈哈
8 楼 风花雪月饼 2009-03-28  
zephyrleaves 写道
hantsy 写道
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。



Struts1 就是单例的..如果不可行.就不会这么多人用了...
只要处理的好还是可以用的....
问题就是要处理的好..线程相关的要自己处理了.


Struts1是有ActionForm
Struts2对应的是Action中的一个成员。

用单例不怕把成员实例覆盖么?
7 楼 slaser 2009-03-28  
hantsy 写道
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。

无状态的对象单态没问题,如struts1的action,又如一般意义上的service.
另外一个方向来说,如果我的需求就是要让这个action数据全局共享,显然web框架该给我提供这个功能。
一如JSF的backed bean,Action应该可以设置作用域,决定是否可以共享。
6 楼 slaser 2009-03-28  
这2天我也恰好考虑到LZ的问题。我倒是觉得struts2的action每次都create并不能满足所有的需求,我就是要在action里面放application或者session级别的共享数据如何?感谢spring,可以把我的action设置成为不同的作用域,让我的action在application和session中共享。
5 楼 duooluu 2009-03-28  
zephyrleaves 写道
hantsy 写道
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。



Struts1 就是单例的..如果不可行.就不会这么多人用了...
只要处理的好还是可以用的....
问题就是要处理的好..线程相关的要自己处理了.

s1跟s2在action的处理上是完全不一样的
s1如果如果设置scope是request,每次请求actionform是新的
s2则是用action取代了s1的actionform和action的功能,提交的数据和渲染到页面的数据都在action里,这是没法共享的,所以s2的action也就不能用单例
4 楼 zephyrleaves 2009-03-28  
hantsy 写道
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。



Struts1 就是单例的..如果不可行.就不会这么多人用了...
只要处理的好还是可以用的....
问题就是要处理的好..线程相关的要自己处理了.
3 楼 hantsy 2009-03-28  
单例根本就不可行。。。主要是线程安全问题。
如果是单例,Action 中数据就是共享的。在多线程下,这种错误是致命的。
2 楼 风花雪月饼 2009-03-28  
请问你用session和单例有什么区别没有?????


提示你一下:
如果我打开两个浏览器同时提交向一个action会出现什么???

1 楼 zephyrleaves 2009-03-28  
...........................
Action 单例的话很带来很多问题的...很多东西都要自己处理

首先action就不应该带有状态了..
如你说的用拦截器去清理状态感觉不是很合适,一般用threadlocal去存那些状态.然后用拦截器去请这个threadlocal就可以了


还有...为啥用spring整合Struts2后action会变单例呢?
这好像是两码事吧...

相关推荐

    Hibernate struts2 spring 整合应用学生信息管理系统源码及文档

    《整合Hibernate、Struts2与Spring的学生信息管理系统详解》 在Java Web开发领域,整合Hibernate、Struts2和Spring框架是构建高效、可维护性高的应用程序的常见实践。本系统——"学生信息管理系统",正是这种整合...

    都市信息网(Struts2+sql server 2000)

    - **事务管理**:Struts2可以配合Spring框架进行事务控制,保证数据一致性。 4. **项目结构分析**: - **01**等文件可能代表项目的不同模块或资源,如Java源代码、配置文件、静态资源等。 - **jsp源码**:表示...

    基于struts+hibernate的采购管理系统源码.zip

    Struts2作为MVC(模型-视图-控制器)框架,负责处理用户请求和业务逻辑,Spring则提供了依赖注入和事务管理等功能,而Hibernate作为持久层框架,简化了数据库操作,实现了对象关系映射(ORM)。这种架构具有良好的...

    增删查改完整示例

    在这个示例中,Spring可能会被用来管理Struts2的Action实例,实现服务层和DAO层的事务控制,并且可能使用Spring的IoC容器来配置数据源。 Hibernate作为ORM(对象关系映射)工具,是SSH中的数据库访问层。它使得Java...

    JSP基于SSH2快递寄件仓库物流配送管理系统设计毕业源码案例设计.zip

    SSH2框架,即Struts2、Spring和Hibernate的集成,为开发提供了强大的支持,它简化了Web应用的构建,提高了代码的可维护性和可扩展性。 首先,我们需要理解SSH2框架的核心组件: 1. **Struts2**:这是一个基于MVC...

    都市供求信息网(Struts2.20+SQL Sever 2005)

    首先,Struts2是Java企业级应用中广泛使用的MVC(Model-View-Controller)框架,它简化了Web应用的开发,通过Action、Interceptor、Result等核心概念,实现了业务逻辑与表现层的分离。在都市供求信息网中,Struts2被...

    SSH框架的理解及其应用实践

    开发者可以通过Spring的AOP实现日志记录、安全控制等通用功能,利用Struts的拦截器进行请求预处理和后处理,以及使用Hibernate简化数据库操作。同时,由于这三个框架都是开源项目,有着丰富的社区支持和众多的扩展库...

    hr.zip_ssh人事_人事管理 ssh_人事管理系统

    Struts通过Action类和配置文件来定义业务流程,实现了模型与视图、控制器的解耦,简化了大型项目的开发工作。 3. **Hibernate框架**:是一个持久层框架,主要处理数据库操作。它提供了一种对象关系映射(Object-...

    JAVA培训班 金桥培训 内部资料 课件+技术 完整。很值得学习。

    2. **Action类**:每个Struts应用的核心是Action类,它处理来自用户的请求,调用业务逻辑,并返回一个结果到视图层。 3. **配置文件**:Struts应用需要配置struts-config.xml文件,定义Action映射、Form Bean、结果...

    SSH整合+struts convention插件小示例

    全程使用注解扫包,无struts action的配置文件,无Hibernate配置文件, Spring自动扫包来获取bean 数据库内容太简单,不再上传。 只是一个小实例。 请用MyEclipse导入项目。 我的版本是MyEclipse 2013

    jbpm5+ssh集成

    - **配置SSH框架**: 配置Spring的bean定义、Struts2的action配置以及Hibernate的实体映射。 - **编写业务逻辑**: 实现Struts2的动作类,通过Spring注入jbPM5的服务,启动和控制流程。 - **界面展示**: 创建视图...

    JAVA项目描述.pdf

    - Spring的IoC容器负责组件间的依赖注入,JavaScript进行前端表单验证,Struts标签和Hibernate数据持久化技术实现了用户管理、租房信息发布等功能。 - 作为独立开发者,我完整地完成了项目开发,加深了对SSH框架和...

    AutoCode代码生成器【SSH版】

    【用于JAVA开发中的 Struts2.0 + Spring2.0 + Hibernate3.2 框架整合程序开发】 强大的支撑功能,堪称JAVA SSH编程的利器,你绝对值得拥有! 自动生成以下所有内容(即:完整的Java SSH支持的工程) Sturts2.0配置--&gt;...

    AutoCode代码生成器(SSH版)

    【用于JAVA开发中的 Struts2.0 + Spring2.0 + Hibernate3.2 框架整合程序开发】 强大的支撑功能,堪称JAVA SSH编程的利器,你绝对值得拥有! 自动生成以下所有内容(即:完整的Java SSH支持的工程) Sturts2.0配置--&gt;...

    ssh代码生成器轻松、快捷

    用于JAVA开发中的 Struts2.0 + Spring2.0 + Hibernate3.2 框架整合程序开发】 强大的支撑功能,堪称JAVA SSH编程的利器,你绝对值得拥有! 自动生成以下所有内容(即:完整的Java SSH支持的工程) Sturts2.0配置--&gt; ...

    SSH代码生成工具 SSH代码生成器

    Spring2.0配置--&gt; applicationContext.xml Hibernate3.2配置--&gt; hibernate.cfg.xml JSP文件--&gt; 具有Struts2.0支持的增、删、改、查页面及自定义查询、自动分页等操作 Action--&gt; 业务Action.java和导出Excel的...

    《JSP项目开发全程实录》的Jar包 B

    2. **j2ee.jar**:这个文件是Java 2 Platform, Enterprise Edition (J2EE)的API库,包含了JSP、Servlet、EJB(Enterprise JavaBeans)等组件的接口定义,用于开发分布式、多层的企业级应用。JSP和Servlet是Web开发中...

    项目驱动式教学法在《JAVA框架技术》中的实践研究.pdf

    例如,Struts2项目会涉及到Action、struts.xml配置文件、拦截器、业务控制器、输入校验以及文件上传和下载等功能。Hibernate项目则要掌握其核心组件和高级应用,包括对象映射、查询接口、事务处理等。Spring 3项目则...

    重庆三峡学院毕业设计(论文)开题报告

    3. **框架整合**:整合Struts2、Hibernate和Spring三大框架,实现MVC架构下的数据持久化和业务逻辑处理。 4. **路径配置**:合理设置绝对路径与相对路径,确保程序运行的稳定性。 5. **用户安全注销**:提供安全的...

Global site tag (gtag.js) - Google Analytics