为了对抗同源策略,我创建了一个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返回它返回的内容?
谢谢
答案 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 it would be a more elegant solution中包装JS。我将更多地介绍使用JSONP的好处,但我链接的文章在比较基于代理的解决方案和JSONP方面做得非常好。
答案 1 :(得分:1)
在代理servlet中,无论是否引发异常,请调用:
response.setStatus(httpURLConnection.getResponseCode());
干杯:^)