前段时间在做一项目时,需求是这样的,在我们开发的系统中引用其它系统(这里称为x应用)的几个模块,x应用只需提供用户名和密码是可以访问的。这就涉及到了跨域访问的问题了。
需要在登陆我们系统的时候也得同时登陆x应用。ajax方式是行不通的,没法进行跨域访问。那就想其它的办法,以前做过无刷新上传文件的例子。所以就想这么做,在登陆我们系统后,在一个页面中建一个隐藏的form和iframe。form中有x应用的登陆用户名和密码。在form提交时候把提交对象设置为该iframe(属性为target)。改完之后发现有问题。ie中无法登陆x应用。其它浏览器如chrome、firefox浏览器是可以的,而且在ie中,如果访问过一次x应用,再登陆时也是可以的。google了一下,知道了其中的原因,是因为ie中提交给iframe时,x应用发回的cookie是浏览器是不接收的(或服务器没有发回?)。google了一下,发现可以设置x应用中的jsp(如果是jee)就可以解决此问题。这里是该方法的链接地址。
<% response.setHeader("P3P","CP=CAO PSA OUR"); %>
但不能随便改别人的应用吧,如果x应用是自己开发的,就好说了。如果是其它公司可就不那么容易了。基于在ie中,如果访问过一次x应用,再登陆时也是可以的这种现在象,另一种解决方法就出来了。就是把form中提交的对象改为一个弹出页面。问题就解决了。代码如下所示:
<form style="display:none" target="" name="fm" method="post" action="x应用的登陆地址"> 姓名:<input type="text" name="LoginName" value="administrator"><br> 密码:<input type="text" name="LoginPassword" value="administrator"><br> </form>
function login(){ var openers = window.open("","test_open"); if(openers == null) { alert("请允许本站点弹出窗口,否则部分功能无法正常使用!"); return; } fm.target = "openers"; fm.submit(); setTimeout(function(){ openers.close(); },1000); }