2013-04-12 61 views
1

爲了抵制同源策略,我創建了一個Java Servlet,它充當我的AJAX請求的代理服務器,以從其他位置獲取XML。強制servlet從URL返回任何內容,而不是java.io.IOException?

問題是,任何HTTP錯誤響應都不會返回到我的客戶端,而是被捕獲爲異常並記錄下來。

我怎麼能強迫該servlet不管它發現是否返回其404,500等

這是我的日誌

java.io.IOException: Server returned HTTP response code: 500 for URL: 

java.io.IOException: Server returned HTTP response code: 403 for URL一個例子:

這裏是我的代碼:

String url = "http://www.test.com/test.xml"; 
URL kcim = new URL(url); 


     URLConnection kciconn = kcim.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(kciconn.getInputStream())); 
     String inputLine; 
     PrintWriter out = kciResponse.getWriter(); 

     while ((inputLine = in.readLine()) != null) 
     { 
      //output to client 
      out.println(inputLine); 

     } 

    //close output stream 
    System.in.close(); 
    in.close(); 

所以在su當我收到一個HTTP錯誤代碼後,mmary servlet會自行破壞,導致我從servlet中獲取HTTP 500 Server錯誤,而不是從正在訪問的資源中獲取真正的HTTP代碼。

我該如何阻止它中斷並強制servlet返回它返回的內容?

感謝

+0

所以你想客戶瞭解與迴應的內容一起響應狀態代碼。那是對的嗎 ? –

+0

是的,servlet收到的任何東西我想傳遞到客戶端 – kaleeway

回答

1

代理

你不處理由目標服務器發送的響應狀態代碼或處理由他們發送的頭,讓客戶永遠不會看到它們。使用Apache HTTP客戶端可以解決這個問題。下面的代碼片段處理狀態代碼並讀取響應頭(但不設置任何)。您可以將其用作模板並根據需要對其進行修改。例如,URL https://github.com/thisurldoesnotexist不存在,並且響應狀態碼正確設置爲404。我假設API調用是GET s。

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet request = new HttpGet("https://github.com/thisurldoesnotexist"); 
    HttpResponse response = client.execute(request); 
    StatusLine statusLine = response.getStatusLine(); 

    // Echo whatever headers you are interested in. 
    Header[] allHeaders = response.getAllHeaders(); 

    resp.setStatus(statusLine.getStatusCode()); 
    BufferedWriter bufferedWriter = null; 
    try 
    { 
     bufferedWriter = new BufferedWriter(resp.getWriter()); 
     InputStream content = response.getEntity().getContent(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(content,"UTF-8")); 
     String temp = null; 

     while((temp = bufferedReader.readLine()) != null) 
     { 
      bufferedWriter.write(temp); 
      bufferedWriter.newLine(); 
     } 
    } 
    catch (Exception e) 
    { 
     resp.setStatus(500); 
     // handle the exception 
    } 
    finally 
    { 
     if(bufferedWriter != null) 
     { 
      bufferedWriter.flush(); 
      bufferedWriter.close(); 
     } 
    } 
} 

JSONP

雖然這片段將解決你的問題,我建議你也看看JSONP。如果您的第三方提供商可以將這個JS包裝在JSONP it would be a more elegant solution中。我會多寫一些關於使用JSONP的好處,但我鏈接的文章在比較基於代理的解決方案和JSONP方面做得相當不錯。

+0

謝謝,我無法做JSONP,因爲我無法控制外部源。另外,由於在兩種類型中使用的標籤 – kaleeway

+0

當然,您無法使用JSONP進行XML操作。只是想拋出'JSONP'選項,以防你沒有考慮它。乾杯。 –

+0

嗨,當我部署這個我得到「java.lang.ClassNotFoundException:org.apache.http.client.methods.HttpUriRequest」 – kaleeway

1
  1. 使用HttpURLConnection的,而不是URLConnection的
  2. 在您的代理servlet,一個異常是否提高或沒有,請致電:

    response.setStatus(httpURLConnection.getResponseCode());

乾杯:^)

相關問題