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

Servlets 强制servlet从URL返回任何内容,而不是java.io.IOException?,servlets,Servlets,为了对抗同源策略,我创建了一个Javaservlet,它充当代理服务器,用于从其他位置获取XML的AJAX请求 问题是任何HTTP错误响应都不会返回到我的客户端,而是作为异常捕获并记录 我如何强制servlet返回它找到的任何内容,无论是404500等等 这是我日志中的一个示例 java.io.IOException: Server returned HTTP response code: 500 for URL: 或 java.io.IOException:服务器返回URL的HTTP响应代

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

问题是任何HTTP错误响应都不会返回到我的客户端,而是作为异常捕获并记录

我如何强制servlet返回它找到的任何内容,无论是404500等等

这是我日志中的一个示例

java.io.IOException: Server returned HTTP response code: 500 for URL: 
java.io.IOException:服务器返回URL的HTTP响应代码:403

这是我的密码:

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服务器错误,而不是从被访问的资源获取真正的HTTP代码

如何阻止它崩溃并强制servlet返回它返回的任何内容

谢谢

代理 您没有处理目标服务器发送的响应状态代码,也没有处理目标服务器发送的头文件,因此客户端永远无法看到它们。使用ApacheHTTP客户端,您可以解决这个问题。下面的代码段处理状态代码并读取响应头(但不设置任何响应头)。您可以将其用作模板,并根据需要进行修改。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 虽然这段代码可以解决您的问题,但我建议您也看看。如果您的第三方提供商可以包装JS。我想多写一些关于使用JSONP的好处的文章,但我链接的这篇文章在比较基于代理的解决方案和JSONP方面做得相当不错

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

    response.setStatus(httpURLConnection.getResponseCode())


  • 干杯:^)

    所以您希望客户机知道响应状态代码以及响应内容。这是正确的吗?是的,servlet接收到的任何我想要传递到客户端的内容谢谢,我不能执行JSONP,因为我无法控制外部源。此外,由于在两种类型中都使用了标记,因此无法使用JSONP生成XML。只是想抛出
    JSONP
    选项,以防您没有考虑它。Cheers.Hi,当我部署它时,我得到了“java.lang.ClassNotFoundException:org.apache.http.client.methods.HttpUriRequest”,您需要对组
    org.apache.httpcomponents
    中的
    httpclient
    进行maven依赖。谢谢,出于某种原因Eclipse没有将我的库放入servlet“lib”文件夹。我必须使用7zip手动将它们放入