簡體   English   中英

Servlet返回錯誤響應

[英]Servlet returns wrong response

我剛剛在我的這個小項目上啟動了servlet,所以請保持警惕。 我有一個靜態HTML,其中的一些JS在后台使用:

var xmlhttpRequest = new XMLHttpRequest();
xmlhttpRequest.onreadystatechange = function(){
            if (xmlhttpRequest.readyState==4){
                if (xmlhttpRequest.status == 200){
                    var rString = xmlhttpRequest.responseText;
                    alert(rString);
                } 
            }
    }

和JS Servlet調用:

xmlhttpRequest.open("POST", "ServletBase", true);
xmlhttpRequest.send(this.someString);

一切都很好; 在servlet上,在processResponse中,我得到了請求String並將該String傳遞給java類調用ACB:

response.setContentType("text/html;charset=UTF-8");
int requestLength = request.getContentLength();
PrintWriter pWriter = response.getWriter();
if(requestLength>1){
   String inputString = /* i get the string */;
   this.ACB.processPageCommand(inputString,pWriter);
}else{pWriter.write("NULL");}

現在,ACB類是工作類,它處理inputString並與COM3上連接的ArduinoBoard通信並實現SerialPortEventListener 事情發生之后,我使用ACB中的pWriter來回寫東西(有時是一個簡單的String,有時還一個JSON對象作為String):

this.pWriter.write(responseString);

問題是在JS中我收到了錯誤的數據。 例如,我只是在ACB中將引腳32設置為高電平,並想寫回JSON {"pin":"32","state":"1"} 我得到一個空的響應(板上的引腳設置正確); 如果我現在將同一引腳設置為LOW,我應該得到{"pin":"32","state":"0"} ,但是現在我得到第一個響應: {"pin":"32","state":"1"} (板上的針腳設置在右側)。

就在我做this.pWriter.write(responseString); System.out.println(responseString)和responseString是應該的,這意味着ArduinoBoard返回了很好的數據,並且它的處理正常,但是在JS中我得到了“以前的數據”。

我敢打賭這是一件微不足道的事情,但是由於缺乏servlet方面的知識,我無法解決它。 另外,很抱歉很長的帖子:D

瀏覽器正在緩存響應。 在返回數據的servlet中設置無緩存頭。

response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");

這可能可以在大多數瀏覽器上自行解決,但不能在IE上解決,因為IE仍將嘗試緩存通過Ajax接收的響應。 為了解決這個問題,您需要在Ajax POST中添加一個參數,該參數是時間戳或隨機數。 您只需要發送此參數就可以誘騙IE正常工作(通過明確說明這是一個獨特的請求)。 您不必在servlet端讀取參數。

是的,我現在有一個解決方案(不是對所有請求都進行測試):

后我發送一個需要外部硬件處理的請求時,我通常得到一個空的響應,因為PrintWriter.write(responseString)是在synchronized void serialEvent(SerialPortEvent oEvent)的的SerialPortEventListener 在JS端,我檢查了可能的預期返回數據,並基於此,我立即開始發送空請求(在發出任何有意義的請求之前),直到我得到有意義的響應為止-這是在空值之后的下一個響應。

我不知道是否應該將其標記為答案,因為我沒有在所有命令和請求-響應組合上進行測試,而是及時進行了測試.....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM