关于在Struts2的action中直接使用response的异步问题马克
2018-01-05 11:47
381 查看
转自:http://blog.csdn.net/achilles12345/article/details/40376239
如果我们项目中使用了struts2,在使用ajax和后端程序进行通讯时,我们常常为了简单采用以下的方法:
以上的方法实际上是存在一个漏洞的。因为这个破坏了struts2执行的完整性,在程序运行过程中可能会出现执行步骤颠倒的问题,当然了这种方式带来的其他问题比如和servlet耦合等问题不是这里要讨论的。比如存在以下的一个场景:我们前端页面中使用ajax和后台进行通信,获取后台数据后,根据这个数据来访问程序中其他的URL路径。现在我们在web.xml中配置我们自己的Filter,这个Filter在struts2执行之前记下“开始运行”的日志,在Struts2执行完毕之后再记下“结束运行”的日志。严格意义上正确的执行顺序是:
1)我们的Filter打印日志“开始运行”;
2)Struts2执行完毕返回数据给客户端;
3)我们的Filter打印日志“结束运行”;
4)ajax根据结果进行第二次访问;
但是如果我们采用上边的方式执行,则可能出现这种顺序:
1)我们的Filter打印日志“开始运行”;
2)Struts2执行完毕返回数据给客户端;
3)ajax根据结果进行第二次访问;
4)我们的Filter打印日志“结束运行”;
原因可能是我们调用response的Writer返回数据给客户端时,会新开一个线程来完成这个工作,而struts2在继续完成其他的工作.某些情况下response的工作在struts2完成之前就完成了和客户端的交互,(比如使用struts2的result拦截器完成的工作比较耗时)。如果在正常流程中的第4)步会依赖第3)步的操作,比如完成设置数据到session,在苛刻的环境中第4)步访问过来了,结果第3)步仍然没有设置完毕(比如我们包装了request来解决分布式session的问题,因为分布式缓存来缓存session,如果session比较大或者嵌套比较复杂会比较耗时的情况下)就会出问题。
因此,在struts2一定要谨慎直接使用response来完成一些操作。
解决办法,可以使用struts2自己的返回json数据或者二进制的方式来完成这些工作。
如果我们项目中使用了struts2,在使用ajax和后端程序进行通讯时,我们常常为了简单采用以下的方法:
ActionContext ac = ActionContext.getContext(); HttpServletResponse response =(HttpSevletResponse)ac.get(StrutsStatics.HTTP_RESPONSE); response.setContentType("text/html;charset=utf-8"); try { PrintWriter pw = response.getWriter(); pw.print(data); } catch(IOException e) { e.printStackTrace(); }
以上的方法实际上是存在一个漏洞的。因为这个破坏了struts2执行的完整性,在程序运行过程中可能会出现执行步骤颠倒的问题,当然了这种方式带来的其他问题比如和servlet耦合等问题不是这里要讨论的。比如存在以下的一个场景:我们前端页面中使用ajax和后台进行通信,获取后台数据后,根据这个数据来访问程序中其他的URL路径。现在我们在web.xml中配置我们自己的Filter,这个Filter在struts2执行之前记下“开始运行”的日志,在Struts2执行完毕之后再记下“结束运行”的日志。严格意义上正确的执行顺序是:
1)我们的Filter打印日志“开始运行”;
2)Struts2执行完毕返回数据给客户端;
3)我们的Filter打印日志“结束运行”;
4)ajax根据结果进行第二次访问;
但是如果我们采用上边的方式执行,则可能出现这种顺序:
1)我们的Filter打印日志“开始运行”;
2)Struts2执行完毕返回数据给客户端;
3)ajax根据结果进行第二次访问;
4)我们的Filter打印日志“结束运行”;
原因可能是我们调用response的Writer返回数据给客户端时,会新开一个线程来完成这个工作,而struts2在继续完成其他的工作.某些情况下response的工作在struts2完成之前就完成了和客户端的交互,(比如使用struts2的result拦截器完成的工作比较耗时)。如果在正常流程中的第4)步会依赖第3)步的操作,比如完成设置数据到session,在苛刻的环境中第4)步访问过来了,结果第3)步仍然没有设置完毕(比如我们包装了request来解决分布式session的问题,因为分布式缓存来缓存session,如果session比较大或者嵌套比较复杂会比较耗时的情况下)就会出问题。
因此,在struts2一定要谨慎直接使用response来完成一些操作。
解决办法,可以使用struts2自己的返回json数据或者二进制的方式来完成这些工作。
相关文章推荐
- 关于在Struts2的action中直接使用response的异步问题
- 有关Struts2a的ction直接使用response异步问题
- 关于在Struts2的Action中使用domain模型接收参数的问题
- 关于在Struts2的Action中使用domain模型接收参数的问题
- 关于struts2使用命名空间后action路径问题
- 关于在Struts2的Action中使用domain模型接收参数的问题
- 关于在Struts2的Action中使用domain模型接收参数的问题
- 关于Struts2使用redirectAction方式在两个Action之间传值时中文乱码问题的解决方法
- 关于struts2中action请求会执行两次的问题
- 关于struts2中<s:action>的问题
- struts2与spring集成时,关于Action类中成员bean自动注入的问题
- Struts2中field级别错误导致action无法使用的问题
- struts2中Action的各项默认值及使用Action直接转发jsp页面
- 关于struts2获取action中提示消息在jsp页面乱码的问题
- 关于Struts2中token的使用问题
- 关于struts2的访问action与根目录文件夹的冲突问题,碉堡了!
- 关于使用struts2-jquery-mobile-showcase插件报错的问题!!!
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
- 关于struts 访问action直接打开新窗口问题