假设我们在项目中使用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. VS2010添加默认路径,库以及Lib

    下面以OpenCV为例,不需要每次打开VS2010都手动添加OpenCV的库和lib,具体方法如下: VC++目录 步骤一:用任意文本编辑器打开:  VS安装目录中的\VC\VCWizards\def ...

  2. 通过Java字节码发现有趣的内幕之String篇(上)(转)

    原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...

  3. POJ 1838 Banana (并查集)

    Description Consider a tropical forrest, represented as a matrix. The cell from the right top corner ...

  4. 天嵌E9平台下进行USB Wifi模块RT3070驱动的移植

    因为项目工作须要,要在天嵌E9平台下实现wifi的点对点,点对多点的传输. Wifi 模块芯片:雷凌3070芯片 嵌入式平台:E9(ARM) 交叉编译环境:arm-none-linux-gnueabi ...

  5. HTML中&lt;input&gt;參数,以及文本输入框,文本域的解说

    <form> <input type="text/password" name="名称" value="文本" /> ...

  6. SVM-SVM概述

    (一)SVM背景资料简介 支持向量机(Support Vector Machine)这是Cortes和Vapnik至1995首次提出,样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到 ...

  7. [Java] HttpClient有个古怪的stalecheck选项

    打开stale check会让每次http请求额外消耗15毫秒.而且stalecheck选项缺省是打开的. 这有必要吗???? 在局域网里面调用web api service的时候会死人的. http ...

  8. 【原创】leetCodeOj --- Binary Tree Right Side View 解题报告

    二连水 题目地址: https://leetcode.com/problems/binary-tree-right-side-view/ 题目内容: Given a binary tree, imag ...

  9. uip UDPclient模式通信移植,当地port随机

    现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************ ...

  10. Word文件交换的电脑打开字体、排版变化的原因和解决方法!

    方案: 有时候.我们好不easy用Word写好文档,做好排版发给别人,别人会告诉你格式怎么是乱的啊,标题.正文.页眉页脚什么的格式都变了. 想尽各种办法都没能得到解决,那么出现这样的情况的原因究竟是什 ...