Servlets 强制servlet从URL返回任何内容,而不是java.io.IOException?
为了对抗同源策略,我创建了一个Javaservlet,它充当代理服务器,用于从其他位置获取XML的AJAX请求 问题是任何HTTP错误响应都不会返回到我的客户端,而是作为异常捕获并记录 我如何强制servlet返回它找到的任何内容,无论是404500等等 这是我日志中的一个示例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响应代
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客户端,您可以解决这个问题。下面的代码段处理状态代码并读取响应头(但不设置任何响应头)。您可以将其用作模板,并根据需要进行修改。URLhttps://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方面做得相当不错
干杯:^)所以您希望客户机知道响应状态代码以及响应内容。这是正确的吗?是的,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手动将它们放入