是否有解决使用objectOutputStreamhere
和sendRedirect()
之间冲突的解决方案!?
private void writeObjectStream(HttpServletRequest request,
HttpServletResponse response) {
getQueryFromAttribute(request);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(response.getOutputStream());
oos.writeObject(appInfo);
oos.writeObject(serviceInfo);
oos.writeObject(queriesMap);
response.reset();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtil.closeQuietly(oos);
}
}
在这里我称之为writeObjectStream
writeObjectStream(request, response);
try {
response.sendRedirect(response.encodeRedirectURL(appInfo.getUrl()));
} catch (IOException e) {
e.printStackTrace();
}
我尝试了另一个解决此问题的方法如下:
private void writeObjectStream(HttpServletRequest request,
HttpServletResponse response) {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(response.getOutputStream());
oos.writeChars("x");
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtil.closeQuietly(oos, ois);
}
}
writeObjectStream
的召唤:
....
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "www.sample.com");
response.setHeader("Content-Length", "" + 500);
writeObjectStream(request, response);
return true;
}
此解决方案的问题是,当我尝试java.io.EOFException
时,它会在服务器端启动ois = new ObjectInputStream(request.getInputStream());
答案 0 :(得分:2)
在 sendRedirect
之后写 return 语句 response.sendRedirect(response.encodeRedirectURL(appInfo.getUrl()));
return;
正在加载HttpServletResponse#sendRedirect
如果响应已经提交,则此方法抛出IllegalStateException。使用此方法后,响应应为 被认为是承诺,不应写入。
您也在调用reset()
。如果您想调用它,您应该在提交响应之前调用它
根据{{3}}
清除缓冲区中存在的所有数据以及状态代码和标头。如果响应已提交,则此方法抛出IllegalStateException。
答案 1 :(得分:1)
HTTP,超文本传输协议,发送标题行(参数名称,冒号,值),数字返回码(200 OK,304 REDIRECT),然后是空行,后跟内容(如HTML页面)或图像)。
sendRedirect
现在输出带有重定向位置的标题行和重定向返回码。然后实际上没有更多内容了。
在Java EE中,当您开始编写时,文本(response.getWriter()
)或二进制数据(response.getOutputStream()
),所有标头必须已经写入。尝试稍后编写标题会出错。 (当第一个缓冲区仍然未写入时,通过缓冲缓解了一点,但可能不会指望它。)
所以你的用法有点不可能。你发回二进制数据,序列化的java对象?到浏览器?同时希望浏览器切换到另一个URL - 之后。
如果您有JavaScript发送AJAX请求,那么您可以先发送自己类型的标题行:
response.setHeader("AfterwardsGoTo", "http://reta-vortaro.de");
然后写二进制数据。