Java Servlet返回错误的响应

Java Servlet返回错误的响应,java,javascript,servlets,response,Java,Javascript,Servlets,Response,我刚刚在我的这个小项目上启动了servlets,所以请温柔一点。 我有一个静态HTML,背景中有一些JS,使用: var xmlhttpRequest = new XMLHttpRequest(); xmlhttpRequest.onreadystatechange = function(){ if (xmlhttpRequest.readyState==4){ if (xmlhttpRequest.status == 200){

我刚刚在我的这个小项目上启动了servlets,所以请温柔一点。 我有一个静态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 void中获取请求字符串,并将该字符串传递给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类是处理输入字符串并与连接在COM3上的ArduinoBoard通信的工作类,它实现了
SerialPortEventListener
。事情发生后,我使用ACB中的pWriter写回东西(有时是一个简单的字符串,有时是一个JSON对象作为字符串):

问题是,在JS中,我收到了错误的数据。例如,我只是在ACB中将引脚32设置得很高,并想写回一个JSON
{“pin”:“32”,“state”:“1”}
。我得到一个空响应(板上的pin设置正确);如果我现在将相同的管脚设置为低,我应该得到
{“pin”:“32”,“state”:“0”}
,但现在我得到第一个响应:
{“pin”:“32”,“state”:“1”}
(板上的管脚设置正确)

就在我做
this.pWriter.write(responseString)之前
I
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帖子中添加一个时间戳或随机数参数。你只需要发送这个参数就可以使IE正常工作(通过明确这是一个独特的请求)。您不必读取servlet端的参数。

是的,我现在有一个make-do解决方案(没有测试所有请求):

发送需要外部硬件处理的请求后,通常会得到一个空响应,因为PrintWriter.write(responseString)位于
SerialPortEventListener的
synchronized void serialEvent(SerialPortEvent oEvent)
中。在JS方面,我检查了可能的预期返回数据,并基于此,我立即开始发送空请求(在发出任何有意义的请求之前),直到得到有意义的响应——这是emtpy响应之后的下一个响应


我不知道是否应该将此标记为答案,因为我没有在所有命令和请求-响应组合上测试它,但随着时间的推移……

我尝试了setHeader并在每个帖子中传递一个唯一的数字,但同样的问题也发生了。现在我相信它与我的后期处理的性质有关。有些POST不需要在外部硬件(ArduinoBoard)上进行处理,并且返回良好的结果,但是程序在外部硬件上等待一些命令,以使用SerialPortEventListener返回确认。在这个类中,我将PrintWriter作为一个全局变量,并且只有当board返回一些数据时,我才会写回JS。可能是servlet没有“等待”那么长时间吗?可能是这样的:当外部硬件发送数据时,代码会创建一个响应字符串,下次我发送命令时,servlet会返回上一个响应,因为响应字符串是在synchronized void serialEvent(SerialPortEvent oEvent)中创建的SerialPortEventListener的;而PrintWriter在该类中是全局的。。。。。我不能反对你的建议,因为我没有足够高的声誉,但我非常感谢你让我考虑缓存:D
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");