最近在做的一個前後端分離的一個項目,這就涉及到登入驗證的問題。我用的是token加上filter。
1,前端請求登入的時候,用使用者名稱和加上目前時間產生一個token,存入redis,然後返回給前端。
2,以後每次請求前端帶上token,在filter裡做驗證。
3,判斷token是否有效,有效則允許存取,無效則重新導向到登入頁面。
這就存在一個問題,ajax請求返回的json資料或者html.預設的是局部重新整理頁面。sendRedirect(“XXX”)重新導向無效。
解決辦法是前後台配合。
在filter裡面加上如下
java
httpResponse.addHeader("REDIRECT", "REDIRECT");//告訴ajax這是重新導向
httpResponse.addHeader("CONTEXTPATH", tokenUrl);//重新導向地址
這時候回應標頭中就會出現如下兩行
然後前端代碼如下:
$.ajaxSetup({ complete : function(XMLHttpRequest, textStatus) { // 通過XMLHttpRequest取得回應標頭,REDIRECT var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT說明後端想重新導向 alert(redirect); if (redirect == "REDIRECT") { var win = window; while (win != win.top){ win = win.top; } win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH"); } } });
ajaxSetup的使用方百度強調內容
網上大概也就是這些思路。但是還有一個坑,
XMLHttpRequest.getResponseHeader(“XXX”),通過CORS方式解決的ajax跨域,是擷取不到要求標頭的。getResponseHeader的值一直為空白。
要通過Access-Control-Expose-Headers來設定回應標頭的白名單。
httpResponse.addHeader(“Access-Control-Expose-Headers”, “REDIRECT,CONTEXTPATH”);將想要傳遞的欄位設定一下。才能擷取到值。