**赏金4天后到期。回答此问题可获得+200声望奖励。shailesh yadav正在寻找一个可靠来源的答案。
下面是我们已经/想要实现的场景:
我们在apachetomcat上部署了一个基于javaspring的web应用程序。
在我们的web应用程序中,我们将为用户提供基于.net的第三方web应用程序链接。单击哪个用户将被重定向到.net应用程序,但浏览器url中显示的域和上下文根将与java应用程序相同。
我们不能要求第三方团队更改其应用程序中的任何内容。
无论我们必须更改什么,都应该在代码中,而且我们应该尽可能避免任何apachetomcat级别的更改。
以下是我们迄今为止实施的措施:
我们尝试使用以下链接实现反向代理:https://github.com/mitre/http-proxy-servlet
因此,基本的方法是将第三方url作为web服务调用,编辑httpresponse,并将我们的域和上下文路径添加到作为响应接收的任何文件中的url。虽然这不是一个很好的解决方案,消耗了大量的时间和空间,但它确实起到了作用。
我们面临的问题:
除了.net应用程序中的ajax请求外,其他一切都正常工作。
引发的错误为:sys.webforms.pagerequestmanagerparsererrorexception:无法分析从服务器接收的消息。此错误的常见原因是通过调用response.write()修改响应、启用响应筛选器、httpmodules或服务器跟踪。
下面是执行httpresponse修改任务的代码片段:
protected void copyResponseEntity(HttpResponse proxyResponse, HttpServletResponse servletResponse,
HttpRequest proxyRequest, HttpServletRequest servletRequest)throws IOException {
HttpEntity entity = new BufferedHttpEntity(proxyResponse.getEntity());
if (entity.isChunked()) {
InputStream is = entity.getContent();
String proxyBody = EntityUtils.toString(entity);
proxyBody = proxyBody.replaceAll("/.netContextRoot/", "/ourContextRoot/.netContextRoot/");
InputStream stream = new ByteArrayInputStream(proxyBody.getBytes(StandardCharsets.UTF_8));
OutputStream os = servletResponse.getOutputStream();
byte[] buffer = new byte[10 * 1024];
int read;
while ((read = stream.read(buffer)) != -1) {
os.write(buffer, 0, read);
if (doHandleCompression || stream.available() == 0 /* next is.read will block */) {
os.flush();
}
}
// Entity closing/cleanup is done in the caller (#service)
} else {
String proxyBody = EntityUtils.toString(entity);
proxyBody = proxyBody.replaceAll("/.netContextRoot/", "/ourContextRoot/.netContextRoot/");
EntityUtils.updateEntity(proxyResponse, new StringEntity(proxyBody));
HttpEntity entity2 = proxyResponse.getEntity();
OutputStream servletOutputStream = servletResponse.getOutputStream();
entity2.writeTo(servletOutputStream);
}
}
有人能帮我们解决这个问题吗?如果你有其他的解决方案而没有在apache级别做任何更改,那么请提一下。
提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!