日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

有关Struts2a的ction直接使用response异步问题

發布時間:2024/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 有关Struts2a的ction直接使用response异步问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設我們在項目中使用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數據或二進制的方式將這些工作全部完成。


版權聲明:本文博客原創文章,博客,未經同意,不得轉載。

轉載于:https://www.cnblogs.com/mfrbuaa/p/4718051.html

總結

以上是生活随笔為你收集整理的有关Struts2a的ction直接使用response异步问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。