問題復現:
明明在攔截器里配置了跨域,就是不生效,使用PostMan等后端除錯工具除錯,均正常,Response中有Access-Control-Allow-Origin: *,這個Header,但是前端一直反饋,通過瀏覽器js代碼fetch報跨域問題,如圖:
嗯,,,看看瀏覽器請求:
確實在報CORS錯誤
問題分析:
看到這個瀏覽器請求對http比較了解的同學可能已經猜到大概了,對于非Simple請求,瀏覽器會先發送一次OPTIONS請求,坑就在這里,如果我們用了自定義的header,就不是Simple請求,意味著會發送一次OPTIONS,就是上面瀏覽器除錯工具中的preflight,就是這個請求出現了跨域問題,繼續分析后端代碼,問題出現了:
本次專案安全認證做在了Filter中,其實這個沒問題,好多專案都是在Filter中做的安全認證,不過,它的CORS配置配在了攔截器中(Interceptor),而且在權限認證Filter認證失敗時直接回傳,導致沒有經過攔截器,直接回傳了,不過這種情況也不正常,因為即使安全認證沒通過的請求沒經過過濾器直接回傳了,那正常能通過安全認證的請求應該正常回傳跨域啊,為什么通過postman請求一切正常,瀏覽器卻報錯呢?原因就是我們上面提到的,后端沒有對OPTIONS請求做單獨處理,意味著OPTIONS請求也會經過安全認證的Filter,而瀏覽器發出的OPTIONS請求是沒有攜帶安全認證Header的,所以必然認證失敗,然后直接回傳,沒有加CORS的Header,導致請求本身能訪問,但preflight過不了安全認證Filter訪問不了,直接回傳跨域問題,
問題解決:
找到原因,剩下的就比較簡單了,把CORS配置放到Filter上,并且把優先級提高,起碼要在AuthFilter之前,再測驗沒問題啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544416.html
標籤:其他
上一篇:【牛客】1 基礎語法