背景

通常公司的项目安全起见很多都是部署在内网,而访问者是在外网,这中间就涉及到一个外网和内网转发的问题。

当前的现象除了上面这个之外,还有业务系统和展示系统的分离。

数据报表的展示是一个公司的产品,单独的系统,无法修改源代码,还会有其它类似很多的系统。

业务管理及用户查看报表的权限等都在业务系统,这个由自己开发。

用户(手机app居多)是禁止直接请求报表系统的,都由业务系统处理请求并展示报表。

这里就需要业务系统在处理完权限认证及业务逻辑之后,加工并发送(转发)用户的请求到报表系统并将结果返回给用户。

问题

这层类似于代理转发的组件,使用HttpClient 4开发了一个通用的,之前几个项目下来没出任何问题效果也还不错。

但是最近接入一个新的报表系统,是由flash开发的,收到反馈转发过程中出错了,无法正常展示报表。

在转发时,HttpClient会获取客户端请求的HeaderCookieParameter等,再次进行封装后转发到目标系统,之前按这个套路走一直没有问题,为什么这次就不行了呢?

分析解决

通过抓包工具等进行分析发现这些参数都毫无遗漏的进行了转发,可目标系统就是返回错误。

再仔细查看,发现Fiddler有一行不怎么明显的提示,大意是不支持流数据的拦截查看。

难道请求中除了表单数据之外,还有流数据?

打断点调试,发现还真有,补上以下InputStream的处理代码:

HttpPost httpPost = new HttpPost(url);
InputStreamEntity inputEntry = new InputStreamEntity(request.getInputStream());
httpPost.setEntity(inputEntry);
httpclient.execute(httpPost);

再次启动项目测试,报表终于展示正常!

最后

其实这并不是一个多么难的问题,只在于有没有遇到及考虑到而已。

一个组件的完善是需要通过实际应用的场景来慢慢锤炼的。

你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner