基於瀏覽器的http普通請求與ajax請求
發起一個http請求,可以通過瀏覽器,也可以通過程式去發起。通過程式去發起http請求(比如java中HttpURLConnection),只要是http層的東西都是能夠偽造的,當然大部分還是偽造header頭欄位。而通過瀏覽器去發起的http請求(包括ajax請求),一些常用的header欄位(比如:referer,User-Agent等)是瀏覽器幫我們設定的,在網頁裡面一般我們是沒法直接去重置他們的。不過可以通過一些方法間接去重置這些header欄位,我瞭解的主要有如下兩種方法:
1.以chrom瀏覽器為例,通過chrom的外掛過濾目的網址,然後對訪問這些網址的http請求重置header。參考外掛: https://github.com/chenyoufu/modify-http-headers
2.通過代理軟體fiddler,重置原始請求的header欄位
基於瀏覽器的http請求分為普通請求和ajax請求,普通請求都是同步執行的,ajax請求可以同步也可以非同步(預設非同步)。當這兩種請求到達服務端時候,我們可以通過x-requested-with這個header欄位加以區分。如果是普通請求沒有這個header,取到為null。如果是ajax請求,取到是XMLHttpRequest。
因為ajax請求header欄位是可以設定的,我們能否重置這個header,偽裝成普通請求呢?答案是沒法徹底重置的。如果我們自己設定了x-requested-with這個欄位,瀏覽器還是會去再設定一遍這個值。chrom和ie的做法是直接追加,即服務端列印的結果是:自定義的值,XMLHttpRequest。而火狐是直接列印:XMLHttpRequest。
另外如果我們在ajax請求中自行設定referer這個header也是沒有效果的,瀏覽器會直接覆蓋你所設定的值。
-----------------------------------------------------------------------------------------------------------------------------------------------------
在一次做非常複雜的ajax應用時,如果一個會話已經超時,但是此時再通過ajax請求,那麼ajax返回的則是一個登陸頁面的html,那這下就慘了,頁面上而已就亂了,那麼,能否在java端,如攔截器裡判斷客戶的的請求是否是ajax請求呢,經過查詢,能.
普通請求與ajax請求的報文頭不一樣,通過如下
Java程式碼
- String requestType = request.getHeader("X-Requested-With");
如果requestType能拿到值,並且值為XMLHttpRequest,表示客戶端的請求為非同步請求,那自然是ajax請求了,反之如果為null,則是普通的請求
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
兩者本質別:
AJAX通xmlHttpRequest象請求伺服器伺服器接受請求返資料實現重新整理互動
普通http請求通httpRequest象請求伺服器接受請求返資料需要頁面重新整理
AJAX請求
普通請求
AJAX請求頭會多一個x-requested-with引數,值為XMLHttpRequest
String requestType = request.getHeader("X-Requested-With");
以此為判斷依據