强制servlet从URL返回任何内容,而不是java.io.IOException?

时间:2013-04-12 14:50:29

标签: servlets

为了对抗同源策略,我创建了一个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返回它返回的内容?

谢谢

2 个答案:

答案 0 :(得分:1)

代理

您没有处理目标服务器发送的响应状态代码或处理它们发送的标头,因此客户端永远不会看到它们。使用apache HTTP客户端,您可以解决这个问题。下面的代码段处理状态代码并读取响应标头(但不设置任何响应标头)。您可以将其用作模板并根据需要进行修改。例如,网址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。如果您的第三方提供商可以在JSONP it would be a more elegant solution中包装JS。我将更多地介绍使用JSONP的好处,但我链接的文章在比较基于代理的解决方案和JSONP方面做得非常好。

答案 1 :(得分:1)

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

    response.setStatus(httpURLConnection.getResponseCode());

  3. 干杯:^)