0

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

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 に答える