1

为了对抗同源策略,我创建了一个 Java Servlet,它充当我的 AJAX 请求的代理服务器,以从其他位置获取 XML。

问题是任何 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();

因此,总而言之,当我的 servlet 收到 HTTP 错误代码时,它最终会自行中断,导致我从 servlet 收到 HTTP 500 Server 错误,而不是来自被访问资源的真正 HTTP 代码。

如何阻止它破坏并强制 servlet 返回它返回的任何内容?

谢谢

4

2 回答 2

1
  1. 使用 HttpURLConnection 而不是 URLConnection
  2. 在您的代理 servlet 中,无论是否引发异常,都调用:

    response.setStatus(httpURLConnection.getResponseCode());

干杯:^)

于 2013-04-18T04:48:54.663 回答
1

代理人

您没有处理目标服务器发送的响应状态代码或处理它们发送的标头,因此客户端永远无法看到它们。使用 apache HTTP 客户端,您可以解决这个问题。下面的代码片段处理状态代码并读取响应标头(但未设置任何标头)。您可以将其用作模板并根据需要进行修改。例如 URLhttps://github.com/thisurldoesnotexist不存在,响应状态码正确设置为404。我假设 API 调用是GETs。

@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 中,那将是一个更优雅的解决方案。我会多写一些关于使用 JSONP 的好处,但我链接到的文章在比较基于代理的解决方案和 JSONP 方面做得很好。

于 2013-04-15T14:58:11.967 回答