我在寫一個簡單的Java HTTP服務器,它響應JSON數據。我在發送數據之前嘗試GZip數據,但通常會發回gzip壓縮的數據,導致瀏覽器中出現錯誤。例如,在Firefox中,它會顯示:GZIPOutputStream未正確壓縮HTTP響應的字符串
內容編碼錯誤 您嘗試查看的頁面無法顯示,因爲它使用無效或不受支持的壓縮形式。
有時候,如果我壓縮的字符串很小而沒有某些字符,但它似乎在有括號等時會弄亂。特別是,下面的示例文本失敗。
這是一種字符編碼問題嗎?我嘗試了各種各樣的東西,但它只是不想輕鬆工作。
String text;
private Socket server;
DataInputStream in = new DataInputStream(server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());
while ((text = in.readLine()) != null) {
// ... process header info
if (text.length() == 0) break;
}
out.println("HTTP/1.1 200 OK");
out.println("Content-Encoding: gzip");
out.println("Content-Type: text/html");
out.println("Connection: close");
// x is the text to compress
String x = "jsonp1330xxxxx462022184([[";
ByteArrayOutputStream outZip = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(outZip);
byte[] b = x.getBytes(); // Changing character encodings here makes no difference
gzip.write(b);
gzip.finish();
gzip.close();
outZip.close();
out.println();
out.print(outZip);
server.close();
Jusr好奇,你正在使用哪個Server?導致這樣的設置在服務器級別更容易完成。例如:對於tomcat,您必須爲內容類型「application/json」啓用'gzip'壓縮,然後就完成了。或者你自己寫的服務器是你自己的第一個聲明說的嗎? – Nikhil 2012-02-29 07:38:01
您至少在內容之前的最後一個響應標題行後面缺少一個'CRLF'。 – Bombe 2012-02-29 07:50:12
感謝評論傢伙 - 我實際上是在編寫我自己的服務器,因爲它實際上只是一個簡單的任務。我打開一個端口,只聽Javascript的JSONP請求的請求。 我希望有沒有真正的安全隱患。 關於CRLF,我相信我已經接近底部了: out.println(); – DFx 2012-02-29 13:47:50