0

有没有解决使用objectOutputStreamheresendRedirect()!之间的冲突的解决方案?

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());

4

2 回答 2

2

在sendRedirect之后写return语句

   response.sendRedirect(response.encodeRedirectURL(appInfo.getUrl()));
   return;

根据HttpServletResponse#sendRedirect

如果响应已经提交,则此方法会抛出 IllegalStateException。使用此方法后,应将响应视为已提交,不应写入。

你也在调用reset()。如果你想调用它,你应该在提交响应之前调用它
根据ServletResponse#reset

清除缓冲区中存在的任何数据以及状态代码和标头。如果已提交响应,则此方法将引发 IllegalStateException。

于 2013-08-02T20:05:16.460 回答
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");

然后写入二进制数据。

于 2013-08-02T20:42:17.920 回答