×
文章路径: Java

跨域跳转相关问题

发表于3年前(Jan 27, 2015 10:29:58 AM)  阅读 612  评论 0

分类: Java 开发运维环境

标签: 跨域 forward nginx sendRedirect

1、背景:

昨天有同学碰到这么一个问题,有服务器A部署了系统A,有服务器B部署了系统B,A系统使用IFrame嵌入了B系统相关功能。因为网络权限控制得比较严格,用户暂时只有访问服务器A的权限,与服务器B的网络是不通的,所以用户访问系统A的时候,嵌入系统B的功能页面将是空白。后咨询得知,网络不通的情况只是暂时的,但还是想先通过其他手段能先进行常规的开发和测试。

2、分析:

首先,Iframe本身跨域是没有问题的,只要客户浏览器能正常访问B服务器即可。如果客户跟B服务器网络不通,那Iframe直接嵌入肯定是行不通的。

其次,如果使用转发跳转,在java里面有sendRedirect和forward两种,其中sendRedirect是浏览器转发,所以其实还是浏览器访问目标地址,而forward则是服务器转发,浏览器并不需要具有目标地址的访问权限,但forward不能跨域。

反向代理是唯一可行的方案。可以实现一个servlet,接受一个url地址作为参数,使用java网络相关的api访问url,将目标url的内容完全返回即可,这样只要访问系统A的servlet即可了。但是有几个缺点,如果目标页面url本身做了一些特殊操作,如js的跳转等,可能就会出现一些问题,其次,如果嵌入的页面不是简单页面,本身也包含一些页面跳转,或表单提交,那就行不通了。

针对复杂的页面或系统,采用专用的反向代理服务器是合理的。在这里推荐使用nginx,在nginx配置一个C端口给系统B使用,在Iframe里使用服务器A的地址,端口C的请求全部转发给系统B。

3、结束语:

专用的反向代理服务器是最合适的方案,不管客户是无法访问服务器B还是出于安全考虑屏蔽客户对服务器B的直接访问,nginx都是可以做到的。

发表评论