網站首頁 編程語言 正文
Token跨域問題Response to preflight request doesn‘t pass access control check
作者:軒轅秋風淚 更新時間: 2022-03-14 編程語言記錄一次使用token遇到的跨域問題
一、問題介紹
前端vue使用axios發送請求,給每個請求的請求頭添加token,后端使用Javaweb的filter處理跨域問題
1. 一開始是這樣處理跨域的,登錄的時候挺正常的,token獲取到了
CORSFilter.java
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("設置跨域請求");
HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET,OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, authorization, X-Requested-With");
response.setHeader("Access-Control-Expose-Headers", "authorization");
chain.doFilter(req, resp);
}
2. 當開始發送除登錄以外的請求時,報錯了
Access to XMLHttpRequest at ‘http://localhost/checkAllDynamic’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.
而且查看network時發現有兩個請求
經過網上查找了解到:
當瀏覽器發送非簡單請求時,瀏覽器會先發送一次預請求(Preflight),即圖中的options請求,用于判斷服務器是否允許該次請求,如果沒有返回200則會報401錯誤,即題干所示錯誤
options詳解:
瀏覽器訪問控制機制CORS將請求分為簡單請求和非簡單請求,當發送非簡單請求時會發送一次預請求,即options請求
簡單請求
:
滿足以下條件的請求:
- GET,POST,HEAD請求中的一種
- 除請求頭中默認的,程序員僅增加Accept,Accept-Language,Content-Type等
- content-type只能是application/x-www-form-urlencoded,multipart/form-data,text/plain中的一種
非簡單請求
:不滿足簡單請求的請求,如token校驗中自定義給請求頭增加了authorization
二、問題解決
嘗試的解決方法:
- 當我嘗試使用response.setStatus(HttpServletResponse.SC_OK)解決時,依然報錯,沒有返回200,返回401
- 當我嘗試直接使用chain.doFilter(req, resp)時依然保錯,即最開始出現問題時的做法
經過網上查詢發現,直接return就能放行
正確方法:
判斷是否為options請求,如果是直接返回
if (request.getMethod().equals("OPTIONS")){
return;
}
return不能放在設置請求頭之前,不然會報如下錯誤
三、總結
對瀏覽器訪問控制的機制有了更詳細的認識:
- 知道了什么是跨域
- 了解了options請求
知道如何解決跨域問題:
- CORS:在后端過濾器給response設置相關的請求頭
實力有限,歡迎討論!
原文鏈接:https://blog.csdn.net/qq_45925974/article/details/112971937
相關推薦
- 2023-07-26 TypeScript的類型推導
- 2022-03-24 一篇文章教你如何用C語言實現strcpy和strlen_C 語言
- 2022-09-10 詳解Python腳本如何設置試用期_python
- 2022-07-26 使用Docker將容器目錄掛載到主機上的實現方法_docker
- 2024-03-20 解決(gyp、python等問題):gyp ERR! find VS msvs_version no
- 2022-08-12 Qt實現電子時鐘_C 語言
- 2022-09-16 python?playwright之元素定位示例詳解_python
- 2022-07-18 Linux文件權限
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支