假设我们在项目中使用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. python面向对象的继承

    无话可说,继承主要是一些父类继承,代码是非常具体的 #!/usr/bin/env python #coding:utf-8 class Father(object):#新式类 def __init__ ...

  2. JAVA 计算地球上任意两点(经纬度)距离

    /** * 计算地球上任意两点(经纬度)距离 * * @param long1 * 第一点经度 * @param lat1 * 第一点纬度 * @param long2 * 第二点经度 * @para ...

  3. PHP Html 弹窗,本页面弹窗子页面

    echo '<script type=text/javascript>window.open("","name1","width=100, ...

  4. SecureCRT学习之道:SecureCRT常用快捷键设置与字体设置方法

    1:如果不想每次登陆都输入密码,可以在你打开的session里邮件session option->login action 选中automate logon 双击ogin 和assword分别输 ...

  5. 所有城市list每次从页面花1段时间抽取后写入到数组,

    所有城市list每次从页面花1段时间抽取后写入到数组,

  6. 《Javascript高级程序设计》读书笔记之继承

    1.原型链继承 让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法 function SuperType() { this.property=true; } ...

  7. 面试题 收集请求k千里马

    收集请求k最大值 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人爱好:酷爱数据结构和算法,希望将来从事算法 ...

  8. SQL Server :理解GAM和SGAM页

    原文:SQL Server :理解GAM和SGAM页 我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时 ...

  9. 採用Android中的httpclient框架发送post请求

    /** * 採用httpclientPost请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得 ...

  10. [状压dp] hdu 4064 Carcassonne

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4064 Carcassonne Time Limit: 3000/1000 MS (Java/Othe ...