使用ObjectInputStream在Servlet中接收Ajax请求?

时间:2012-05-25 06:57:16

标签: ajax servlets inputstream

我以下列格式发送我的Ajax请求

xmlhttp.open("POST","http://172.16.xx.xx:8080/ajax/validate",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(send); //where send is a string retrieved from textarea

这是我的Servlet代码

ObjectInputStream in =new ObjectInputStream(request.getInputStream()); 
String inputxmlstring=(String) in.readObject();

我收到以下异常

java.io.StreamCorruptedException: invalid stream header: 3C3F786D

代码有什么问题?我的请求标题内容类型有什么问题吗?

编辑1

             BufferedInputStream in =new BufferedInputStream(req.getInputStream());
             byte[] buf=new byte[req.getContentLength()];
             while(in.available()>0)
             {
              in.read(buf);
             }
             String inputxmlstring=new String(buf);
             System.out.println(inputxmlstring);

如果我将此代码用于Servlet,我会收到以下错误

14:13:27,828 INFO  [STDOUT] [Fatal Error] :1:1: Content is not allowed in prolog
.
14:13:27,843 INFO  [STDOUT] org.xml.sax.SAXParseException: Content is not allowe
d in prolog.


编辑2
我用这段代码来解析。 String inputxmlstring 已在Edit1中使用。

DocumentBuilderFactory fty1 = DocumentBuilderFactory.newInstance();
fty1.setNamespaceAware(true);
DocumentBuilder builder1 = fty1.newDocumentBuilder();
ByteArrayInputStream bais1 = new ByteArrayInputStream(inputxmlstring.getBytes());
Document xmldoc1=builder1.parse(bais1);

1 个答案:

答案 0 :(得分:1)

只有当您知道使用ObjectOutputStream编写的另一端时,才应使用ObjectInputStream。

当客户端使用 ObjectOutputStream时,它会写入特殊字节,表明它是对象流。如果这些字节不存在,ObjectInputStream将抛出StreamCorruptedException。

在您的情况下,您应该使用request.getInputStream()进行读取,因为XMLHttpRequest不是使用ObjectOutputStream发送的。