目前項目結構是VUE做前端,后端采用微服務架構,在開發時前端需要跨域請求數據,通過CorsConfig配置解決了簡單跨域請求需要。但當需要在請求的header中增加token信息時,出現了請求失敗的情況,瀏覽器和后台均出現OPTIONS類型請求相關提示。
搜索資料后發現,在設置了header之后,瀏覽器在發送正式請求前,會先發送一個OPTIONS請求,(據資料)發送OPTIONS請求是為了驗證正式請求的有效性,檢查服務端是否支持正式請求類型(POST、GET 等),但不清楚服務端底層框架在默認情況下時怎么響應該請求的。而OPTIONS請求中不包含任何用戶參數,導致ZUUL中的過濾類型為 pre 的過濾器中的用戶校驗失敗,從而返回用戶提示信息,就無法繼續執行正式請求了。
有資料說需要服務端返回一個狀態是200的響應,但測試直接返回status為200的響應並沒有產生作用,瀏覽器端仍然會顯示請求失敗,並不會執行正式請求。
最終:
通過對過濾器過濾規則進行修改,在是否需要過濾方法體中,增加 如果請求類型為OPTIONS ,則不進行用戶校驗,直接跳過該過濾,由框架本身去響應該請求。代碼如下:
@Component public class AuthFilter extends ZuulFilter { ... /** * pre:路由之前 * routing:路由之時 * post: 路由之后 * error:發送錯誤調用 * * @return */ @Override public String filterType() { return "pre"; } .... @Override public boolean shouldFilter() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); if (request.getMethod().equals("OPTIONS")) { return false; } return true; } ... }