SpringCloud+ZUUL跨域請求中的OPTIONS請求處理


    目前項目結構是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;
    }

    ...

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM