sendRedirect()和ObjectOutputStream之间的IllegalStateException

时间:2013-08-02 20:03:23

标签: java

是否有解决使用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());

2 个答案:

答案 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");

然后写二进制数据。