假设我们在项目中使用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运行完成返回数据给client;

        3)我们的Filter打印日志“结束执行”;

        4)ajax依据结果进行第二次訪问。

可是假设我们採用上边的方式运行,则可能出现这样的顺序:

1)我们的Filter打印日志“開始执行”;

         2)Struts2运行完成返回数据给client。

         3)ajax依据结果进行第二次訪问;

         4)我们的Filter打印日志“结束执行”;

原因可能是我们调用response的Writer返回数据给client时,会新开一个线程来完毕这个工作,而struts2在继续完毕其它的工作.某些情况下response的工作在struts2完毕之前就完毕了和client的交互,(比方使用struts2的result拦截器完毕的工作比較耗时)。假设在正常流程中的第4)步会依赖第3)步的操作。比方完毕设置数据到session。在苛刻的环境中第4)步訪问过来了。结果第3)步仍然没有设置完毕(比方我们包装了request来解决分布式session的问题,由于分布式缓存来缓存session。假设session比較大或者嵌套比較复杂会比較耗时的情况下)就会出问题。

因此。在struts2一定要慎重直接使用response来完毕一些操作。

解决的方法。能够使用struts2自回到自己json数据或二进制的方式将这些工作全部完成。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

有关Struts2a的ction直接使用response异步问题的更多相关文章

  1. 十三:Servlet3.0的异步

    servlet之前的操作同时同步的,就是按照这样的一个流程来走的: 1.请求根据一个路径路由到一个servlet中, 2.servlet获取一系列的参数 3.执行一系列的逻辑(花费时间所占的比重也更大 ...

  2. vue-resource初体验

    这个插件是用于http请求的,类似于jquery的ajax函数,支持多种http方法和jsonp. 下面是resource支持的http方法. get: {method: 'GET'},save: { ...

  3. [Java] JSP笔记 - Filter 过滤器

    一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件, ...

  4. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)

    在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记. 1. 相关阅读资料 <深入解析 windows 操作系统(第4版,中 ...

  5. iOS - NSURLConnection 网络请求

    前言 @interface NSURLConnection : NSObject class NSURLConnection : NSObject DEPRECATED: The NSURLConne ...

  6. React从入门到放弃之前奏(4):Redux中间件

    redux 提供了类似后端 Express 的中间件概念. 最适合扩展的是redux中的 store.dispatch 方法,中间件实际就是通过 override redux的store.dispat ...

  7. SpringMVC 请求全过程漫谈

    SpringMVC 请求全过程漫谈 SpringMVC 跟其他的mvc框架一样,如 struts,webwork, 本质上都是 将一个 http 请求(request)进行各种处理, 然后返回resp ...

  8. SpringMVC参数绑定(四)

    1.默认支持的参数类型 处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值. HttpServletRequest 通过request对象获取请求信息 HttpServletResponse ...

  9. Tuscany glossary of terms

    SOA(service-oriented architecture) 面向服务的架构 解决问题:面向服务.多语言.多种数据格式.多协议 SCA(Service Component Architectu ...

随机推荐

  1. 50个最受网友欢迎的HTML5资源下载列表

    完整附件下载地址:http://down.51cto.com/data/413867 附件预览: HTML 5游戏源码精选(共含9个游戏源码) http://down.51cto.com/zt/227 ...

  2. 程序员的视角:java 线程(转)

    在我们开始谈线程之前,不得不提下进程.无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等. ...

  3. art patchoat

    Add patchoat tool to Art. Add a new executable called patchoat to art. This tool takes alreadycompil ...

  4. OCP读书笔记(17) - 计划任务

    轻量级作业: 也称为持久性轻量级作业,如果当我们的数据库每秒钟需要创建.删除或修改数十个或数百个作业时,使用轻量级作业是降低开销的最佳方法 常规作业:是由oracle 11g Scheduler 所支 ...

  5. osgi实战学习之路:3. osgi分层概念及相互合作demo

    源码下载 分层: modual: 主要作用于包级管理与共享代码 lifecycle: 主要作用于执行期间的模块管理与訪问osgi底层框架 service: 主要作用于多模块之间的相互通信 demo: ...

  6. android选择和裁剪图像拍摄的图像

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39994913 近期从曾经的项目中扒下来一个经常使用的模块.在这里有必要记录一下的. ...

  7. Android Handler Message总结一下

    当应用程序启动时,会开启一个主线程(也就是UI线程).由她来管理UI.监听用户点击.来响应用户并分发事件等.所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误.所以就将这些 ...

  8. listary文件查找程序下载和使用

    资源:PHP开发学习门户网站 地址:http://bbs.phpthinking.com/forum.php?mod=viewthread&tid=173 Listary 是一款有用的国产Wi ...

  9. 更改CPU厂商信息

    更改所检测到第三方手机CPU制造商型号,于kernel\arch\arm\mach-msm以下适当Board-*.c更改文件.例如我们8226的CPU.必要的Board-8226.c在里面DT_MAC ...

  10. android学习七(创建自己定义控件)

    前面学习的是android的基本控件和布局的使用,可是主要的控件和布局有时候并不能实现复杂的布局.我们来看下各种控件和布局的关系. 可见全部的控件都是直接或者间接的继承自View的,全部的布局都是直接 ...