其实这篇文章的标题我也不知道怎么写。
目标:
在album.asp中用Iframe标记打开网易的相册,要求打开的时候处于“已登录”状态。
过程:
最先当然要弄清楚网易的相册可以通过怎样的方式登录。先将登录界面的表单提取出来:
<form method="post"action="https://reg.163.com/logins.jsp?product=photo&type=1&url=http://photo.163.com/photos/szyz02/">
<input type="text" name="username" size="40" value=""id="username" /><br />
<input type="password" name="password" size="25" />
<input type="submit" value="登录" />
</form>
在本机测试了一下,登录成功。
接下来想到能不能不用POST而用GET呢?试着在提交地址后加上用户名和密码信息,依然登录成功,于是大喜,这样就好做多了。
弄清楚了登录的方式,剩下的就是具体如何登录的问题了。
首先想到使用AJAX提交一下登录信息,然后再刷新IFRAME中的内容。
于是首先使用Microsoft.XMLDOM组件尝试,失败;接着使用XMLHTTP组件,依旧失败。都是提示“没有权限”,后来百度了一下,才知道原来这些组件默认情况下是不允许跨域访问的,本来可以通过修改浏览器设置解决,但要每个访问者去修改他们的浏览器设置太不现实,于是放弃。
接下来想到,上述用GET方式登录的地址登录成功后会跳转的,只是不是我要的跳转页面,于是再看了看这个地址,发现跳转的参数是在这个地址中的,于是又喜,改了一下这个参数,果然成功。马上想到直接在IFRAME中使用这个地址,应该就可以通过跳转到达相册列表。实测依旧失败,网易对登录来源做了检查,不允许从其他地方登录。
接下来想到,既然刚刚测试的页面(见上面代码)能够成功,那能不能做个隐藏表单,用脚本让它自动提交呢?结果依旧失败,这次失败的原因就有点郁闷,我弄了半天不知道为什么不行,到最后两个代码完全相同的页面,在本机直接打开的一个能成功,另一个通过IIS后在浏览器中不能成功。
因为以前接触过referrer,知道这是因为网易对referrer做了检查,于是再到百度查了一下referrer的资料,才知道原来在本机直接打开后是不发送referrer信息的,但是在IIS中调试的时候会发送,所以本地打开的能成功,IIS中的不能成功。接下来就想怎么伪造referrer,在百度上搜了半天没搜到,群里问了也没人回答,看来只有另找出路了。
既然在本机直接打开的能成功,那么不发送referrer的一定也能成功,再百度,得知在IFRAME中打开时会将父窗口作为referrer发送,所以上面的测试不成功,直接链接会将前一页面作为referrer发送(这正是referrer的意义),而要让referrer不发送,最简单的办法便是用Javascript弹窗。
于是最后的解决办法诞生:
先弹出一个窗口用GET方式登录,过3秒后将弹窗关闭,这时已是登录状态,再更新IFRAME内容,这样就是登录状态了。实测效果不错,但仍然存在以下缺点:
一、弹窗不美观,而且容易让人产生不信任的感觉,尤其是弹出后自动关闭;
二、IE默认会拦截弹窗,登录仍然有问题;
此外,在TT中还有一个很有趣的现象,将弹窗宽高都设为0时弹窗仍然出现,但设为100时弹窗不见了(IE中仍然有),有点不可理解。
最终代码如下:(其中pagecontent是一个DIV容器,IFRAME通过最后一句动态加载。)
function showalbum()
{
albumpage=window.open("https://reg.163.com/ logins.jsp?product=photo&type=1&url=http://photo.163.com/photos/szyz02/&username=XXXXXXXX&password=XXXXXXXX,"","width=100,height=100,left=100,top=100,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no")
setTimeout("albumpage.close()",3000);
url='<iframe width="755" height="1200"scrolling="no"src="http://photo.163.com/photos/XXXXXXXX/"></iframe>';
setTimeout('pagecontent.innerHTML=url',3000);
}