从java web应用程序到.net web应用程序的反向代理

bgtovc5b  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(299)

**赏金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级别做任何更改,那么请提一下。
提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题