當Web項目前后端分離開發(fā)的時候, 由于域名不一致, 會出現(xiàn)無法請求和無法維持會話的情況 OPTIONS在前端Ajax請求后臺的時候, 打開控制臺可以看到, 每一次請求之前都會有一次OPTIONS類型的請求 Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type 得到服務(wù)器的回應(yīng)后瀏覽器便知道這次請求是否被允許 OPTIONS的處理后臺可以在攔截器或過濾器中處理這個請求, 這里以Springboot后臺的攔截器為例 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { String method = request.getMethod().toLowerCase(); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE"); response.setHeader("Access-Control-Allow-Headers", "X-Requested-With,content-type"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Expose-Headers", "TK"); if (method.equals("options")){ return false; } //... return true; } Access-Control-Allow-Origin 代表允許請求源, 設(shè)置為*或設(shè)置為前端的域名即可解決跨域無法請求的問題例如http://domain 以下兩個特別說明 字由https://www./sites/73248.html 中國字體設(shè)計網(wǎng)https://www./sites/73245.html 利用Token保持會話傳統(tǒng)開發(fā)前后端能維持會話, 是因為當服務(wù)器調(diào)用了HttpSession時, 會將SessionId放在請求頭的set-cookie中, 瀏覽器讀取到了這個信息, 就把SessionId保存在本地, 待下次請求時以Cookie的形式帶給服務(wù)器, 服務(wù)器根據(jù)收到的SessionId找到Session 以繼續(xù)會話 現(xiàn)在由于前后端分離后使用Cookie的種種不便, 可以換另一種方式來進行SessionId的傳輸, 就是把SessionId放在請求頭中帶給瀏覽器 接上一段代碼 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) { //... HttpSession session = request.getSession(); response.setHeader("TK",session.getId()); return true; } 由于設(shè)置了response.setHeader("Access-Control-Expose-Headers", "TK"); 為什么能維持會話服務(wù)器根據(jù)sessionid保持會話這件事是容器完成的, 根據(jù)的就是請求中所傳來的URL后的;jsessionid= 或者 cookie中的jsESSIONID=, 當然你也可以用其他方式手動操作, 比如直接傳參 http://service?JID=${token}, 在請求頭中帶過去之類的, 然后手動取得ID再去找對應(yīng)的Session, 不過這就有點多此一舉了 |
|