概述:
小伙伴說(shuō)遇到了一個(gè)問(wèn)題,有個(gè)客戶ACG本地Web認(rèn)證成功之后無(wú)法跳轉(zhuǎn)到設(shè)置的成功跳轉(zhuǎn)頁(yè)面,看了實(shí)驗(yàn)室成功的抓包發(fā)現(xiàn)不是通過(guò)HTTP 302 跳轉(zhuǎn)的,不知道具體什么跳轉(zhuǎn)原理也無(wú)從排查,我看了下正常跳轉(zhuǎn)的報(bào)文交互,以及從Wireshark下看HTTP傳輸?shù)腏S頁(yè)面源碼,發(fā)現(xiàn)還是挺有趣的。
先看結(jié)論:
ACG在本地web認(rèn)證成功之后不是通過(guò)http 302、Location header方式執(zhí)行頁(yè)面跳轉(zhuǎn)。
ACG在進(jìn)行認(rèn)證頁(yè)面跳轉(zhuǎn)的時(shí)候發(fā)送302 Location,Location的url攜帶了參數(shù):weburl,通過(guò)該參數(shù)攜帶了認(rèn)證成功之后跳轉(zhuǎn)的地址,之后通過(guò)js腳本在瀏覽器側(cè)判斷是否認(rèn)證成功、并執(zhí)行跳轉(zhuǎn)。

所以想要跳轉(zhuǎn)成功:
1. ACG給PC 302 location重定向的url中需要攜帶weburl這個(gè)參數(shù),攜帶的地址也得正確
2. PC的瀏覽器可以正常執(zhí)行JS腳本。
可以自己新建一個(gè)html文件用瀏覽器打開(kāi)測(cè)試下,是否可以正常執(zhí)行JS的跳轉(zhuǎn):
<!DOCTYPE html>
<html>
<body>
<form >
<input type="button" value="JS window open跳轉(zhuǎn)" onclick="javascript:window.open('http://www.baidu.com')">
</form>
<p>點(diǎn)擊submit,打開(kāi)baidu</p>
</body>
</html>
下面部分不感興趣可以不用看了。
頁(yè)面代碼中相關(guān)
點(diǎn)擊認(rèn)證時(shí)候的ajax部分
執(zhí)行跳轉(zhuǎn)頁(yè)面的function
獲取跳轉(zhuǎn)頁(yè)面的function
獲取跳轉(zhuǎn)頁(yè)面url的function
function get_url_special_string(name){
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
這段代碼百度上很容易找到解釋:鏈接。甚至代碼都一毛一樣(除了函數(shù)名字不一樣),一個(gè)字都沒(méi)改,ctrl c、ctrl v大法賽高。
該函數(shù)作用是獲取 http請(qǐng)求的url中?后邊的部分,也就是url中攜帶的參數(shù)。
整個(gè)認(rèn)證過(guò)程中http頭部攜帶的參數(shù)就只有一個(gè):weburl。
GET /portal/local/index.html?weburl=http%3A%2F%2F1.1.1.2 HTTP/1.1
最開(kāi)始我以為這個(gè)weburl作用是表明ACG認(rèn)證頁(yè)面是從哪個(gè)原始地址跳轉(zhuǎn)過(guò)來(lái)的,但是看代碼似乎并不是,而是表明認(rèn)證成功之后跳轉(zhuǎn)的頁(yè)面。
想想也是,ACG全程在url參數(shù)中攜帶認(rèn)證之前的url地址干啥,認(rèn)證之后又不會(huì)給跳轉(zhuǎn)回去.....,主要這個(gè)抓包里認(rèn)證前訪問(wèn)的地址剛好也是1.1.1.2,跳轉(zhuǎn)頁(yè)面也是1.1.1.2,容易讓人誤解。
執(zhí)行跳轉(zhuǎn)頁(yè)面的function
function btn_win_open(url){
if(url !='null'){
$('#redirect').unbind();
$('#redirect').click(function(){window.open(url)});
$("#redirect").trigger("click");
}
}
傳入一個(gè)url,通過(guò)window.open(url)在瀏覽器中打開(kāi)這個(gè)url,也就是所謂的頁(yè)面跳轉(zhuǎn)。
點(diǎn)擊認(rèn)證時(shí)候的ajax部分
$.ajax({
url: '../../portal.cgi',
type: 'POST',
data: 'username=' + encodeURI(username) + '&password=' + password +'&language='+language+ '&submit=submit'
async: false,
timeout: 30000,
success: function(data) {
var weburl = decodeURIComponent(get_url_special_string("weburl")),logincookie= '';
if(weburl){
btn_win_open(weburl);
if(weburl){
btn_win_open(weburl);
}
向/portal.cgi提交認(rèn)證的賬號(hào)密碼,中間省略一堆內(nèi)容,如果認(rèn)證成功(success),執(zhí)行一個(gè)函數(shù),在函數(shù)中存在一個(gè)判斷條件:
if(weburl)
也就是weburl如果存在,執(zhí)行 btn_win_open函數(shù),也就是跳轉(zhuǎn)頁(yè)面的函數(shù),完成認(rèn)證成功后跳轉(zhuǎn)到頁(yè)面的功能。