| docs/功能测试报告/功能测试报告_局域网IP访问登录CORS修复_2026-09-16.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-16.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/common/config/CorsConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/resources/application.yml.example | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_¾ÖÓòÍøIP·ÃÎʵǼCORSÐÞ¸´_2026-09-16.md
New file @@ -0,0 +1,53 @@ # åè½æµè¯æ¥å_å±åç½IP访é®ç»å½CORSä¿®å¤_2026-09-16 > 模åï¼ç³»ç»å®å ¨ï¼è·¨åç½ååï¼+ ç»å½ãæµè¯äººï¼Codexãæ¥æï¼2026-09-16 ## ä¸ãåè½è¯´æ **é®é¢ç°è±¡**ï¼ç¨ `http://192.168.177.26:8080/` æå¼é¡µé¢ï¼ç»å½é¡µè½æ£å¸¸æ¾ç¤ºï¼ä½ç¹ãç»å½ãæç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼åä¸å¥æå¡ç¨ `http://localhost:8080/` ç»å½æ£å¸¸ã **æ ¹å **ï¼æµè§å¨å¯¹ POST/PUT/DELETE **å¿ å¸¦ `Origin` 头**ï¼GET ä¸å¸¦ï¼ã9-14 å®å ¨æ´æ¹æ CORS ä» `allowedOriginPattern("*") + allowCredentials(true)` æ¶ç´§ä¸ºåªåå ·ä½æ¥æºï¼`http://localhost:8080,http://127.0.0.1:8080`ï¼ãç» dev-server ä»£çæ¶ `Origin` åæ ·è½¬åç»å端ï¼äºæ¯ `Origin: http://192.168.177.26:8080` å½ä¸ä¸äºç½ååï¼`CorsFilter` ç´æ¥è¿å 403 `Invalid CORS request`ï¼å®æµæ¥æè§ç¨ä¾ C2ï¼ã è¿è§£éäº"页颿£å¸¸ãä¸ç»å½å°±ç½ç»é误"ï¼é¡µé¢ HTML/JS ä¸ `GET /api/auth/captcha-config` é½ä¸å¸¦ `Origin` å èä¸åå½±åï¼ç»å½é¡µè½æ¾ç¤º"æµè¯æ¨¡å¼"æç¤ºå³è¯æè¯¥ GET æåï¼ã **è¿å¸¦é£é©ï¼æ¬æ¬¡ä¸å¹¶è§£å³ï¼**ï¼æå é¨ç½²æ¯å端å åµã䏿¥å£åæºå¨ 8090ï¼æµè§å¨ POST åæ ·ä¼å¸¦ `Origin: http://<é¨ç½²æºIP>:8090`ï¼ç¨ IP è®¿é®æ¶ä¼åæ ·è¢« 403 æ¡ä½ç»å½ã **æ¹å¨**ï¼2 个æä»¶ï¼`CorsConfig.java` / `application.yml`ï¼ï¼ - `config.setAllowedOrigins(...)` â `config.setAllowedOriginPatterns(...)`ï¼é»è®¤æ¥æºæ¾å®½ä¸ºæ¬æº + å ç½ç½æ®µï¼`http://localhost:*`ã`http://127.0.0.1:*`ã`http://192.168.*:*`ã`http://10.*:*`ã`http://172.*:*`ã - ç½ååæºå¶ä¸åï¼ä»æ¯æ¾å¼æ¥æºæ ¡éªï¼ééé å ¨æ¾å¼ï¼ï¼`allowCredentials` ä»ä¸º `false`ï¼å¦æ¹ç¨åå访é®ï¼éæååï¼å«ç«¯å£ï¼è¿½å å° `app.cors.allowed-origins`ï¼å·²åå ¥ yml 注éï¼ã ## äºãæµè¯ç¯å¢ - å端ï¼8090ï¼æ¹åæ PID 精确éå¯ï¼`cmdâjava(maven)âjava(app)`ï¼ï¼`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090 (http)`ã - å端ï¼8080ï¼dev-server æªéå¯ï¼é¡µé¢ä¸ä»£çæ²¿ç¨æ¬æ¬¡å¯å¨å®ä¾ã - æµè§å¨ï¼Codex åºç¨å æµè§å¨ï¼`http://192.168.177.26:8080/#/login`ï¼ç宿µè§å¨è·¯å¾ï¼é模æï¼ã - å½ä»¤è¡å¯¹ç §ï¼`curl.exe` ç´ååä¸ URLï¼ç¨äºåºå"æå¡ç«¯æç»"ä¸"æµè§å¨ä¾§å¤±è´¥"ã - è´¦å·ï¼`admin`ï¼æ¬æºåºå¯ç `123456`ï¼ã ## ä¸ãç¨ä¾ä¸ç»æ | ç¼å· | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | | --- | --- | --- | --- | --- | --- | | C1 | å¤ç°ï¼ä¿®å¤åï¼æµè§å¨ï¼ | `192.168.177.26:8080/#/login` è¾å ¥ admin/123456 ç¹ç»å½ | å¤ç°"ç½ç»é误ï¼ç»å½å¤±è´¥" | é¡µé¢æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼URL åå¨ `#/login` | å¤ç°æå | | C2 | å¤ç°ï¼ä¿®å¤åï¼å½ä»¤è¡ï¼ | POST `/api/auth/login`ï¼å¸¦ `Origin: http://192.168.177.26:8080` | è½å®ä½å°æå¡ç«¯æç» | `HTTP/1.1 403 Forbidden` + `Invalid CORS request` | å¤ç°æåï¼å®ä½æ ¹å ï¼ | | C3 | å¯¹ç §ï¼ä¿®å¤åï¼ | å C2 ä½ä¸å¸¦ `Origin` | æ£å¸¸ | 200 ä¸è¿å token | éè¿ï¼è¯æå·®å¼æ¥èª Originï¼ | | C4 | ä¿®å¤å LAN æ¥æº | POST `/api/auth/login`ï¼å¸¦ `Origin: http://192.168.177.26:8080` | 200 | 200 + tokenï¼`管çå`/5 模åï¼ | éè¿ï¼æ£åï¼ | | C5 | ä¿®å¤åæµè§å¨å®ç» | `http://192.168.177.26:8080/#/login` è¾å ¥ admin/123456 | ç»å½æåè¿å·¥ä½å° | æç¤ºãç»å½æåãï¼è·³è½¬ `#/dashboard`ï¼é¡¶é¨æ¾ç¤º admin | éè¿ï¼æ£åï¼ç«¯å°ç«¯ï¼ | | C6 | æ¬æºæ¥æºåå½ | `Origin: http://localhost:8080` | 200 | 200 | éè¿ï¼æ åå½ï¼ | | C7 | åæºé¨ç½²åºæ¯ | ç´è¿ 8090ï¼å¸¦ `Origin: http://192.168.177.26:8090` | 200 | 200 | éè¿ï¼æ£åï¼ | | C8 | å ç½ç½æ®µæ¥æº | 带 `Origin: http://10.1.2.3:8080` | 200 | 200 | éè¿ï¼æ£åï¼ | | C9 | 颿£è¯·æ± | `OPTIONS /api/auth/login` + `Origin: http://192.168.177.26:8080` | 200 ä¸åæ¾æ¾è¡æ¥æº | 200ï¼`Access-Control-Allow-Origin: http://192.168.177.26:8080`ï¼æ¹æ³ `GET,POST,PUT,DELETE,OPTIONS` | éè¿ | | C10 | æ Origin 头 | POST `/api/auth/login`ï¼curl ç´è¿ 8090ï¼ | ä¸åå½±å | 200 | éè¿ | | C11 | éæ³æ¥æº | `Origin: http://evil.example.com` | æç» | 403 `Invalid CORS request` | éè¿ï¼è´åï¼ç½ååä»çæï¼ | | C12 | 带令çä¸å¡æ¥å£ | LAN æ¥æº + `Bearer` 令ç GET `/api/user/list` | 200 | 200 | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **CORS ç½ååè¿çªå¯¼è´å±åç½ IP/åæº IP 访é®ç»å½å¤±è´¥**ï¼æ¬æ¬¡ä¸»é®é¢ï¼ï¼å·²æ¹ä¸ºææ¨¡å¼æ¾è¡æ¬æº + å ç½ç½æ®µï¼è§ä¸ï¼éæ³å¤é¨æ¥æºä» 403ã 2. å端 dev æ¥å¿æ¾ç¤º `Network: unavailable`ï¼vue-cli æªæ¢æµå°ç½å¡å°åï¼ï¼ä½ 8080 å®é çå¬ `0.0.0.0`ãå±åç½è®¿é®æ£å¸¸ï¼C5 宿µï¼ï¼å±æ¥å¿æç¤ºé®é¢ï¼ä¸å¤çã 3. ãç½ç»é误ï¼ç»å½å¤±è´¥ãè¿ä¸æç¤ºæ 403/500 çæååºçé误ä¹å½å°"ç½ç»é误"ï¼ææ¥æ¶å®¹æè¯¯å¯¼ï¼`Login.vue` æªæ¹å¨ï¼å为åç»å¯éä¼å项ã ## äºãç»è®º å±åç½ IPï¼`http://192.168.177.26:8080/`ï¼ç»å½å¤±è´¥é®é¢å·²ä¿®å¤ï¼å½ä»¤è¡èµ°æ¥ï¼C4/C6/C7/C8/C9/C10/C12ï¼ä¸ç宿µè§å¨ç«¯å°ç«¯ç»å½ï¼C5ï¼å ¨é¨éè¿ï¼ç½ååè´åç¨ä¾ï¼C11ï¼ä»ç¶æ¦æªï¼æªå¼å ¥é´æ/è·¨ååå½ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
New file @@ -0,0 +1,40 @@ # 工使¥ç»_2026-09-16 ## ä¸ãä»å¤©åäºä»ä¹ ### 1. ç¯å¢å¯å¨ - 11:12 ç¨ `start-dev.ps1` å¯å¨åå端ï¼å¯å¨å 8090/8080 å空é²ï¼ã - 就绪æ å¿ï¼å端 `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`ï¼å端 `Compiled successfully` / `App running at:`ã ### 2. ä¿®å¤ãç¨å±åç½ IP æå¼é¡µé¢åç»å½å¤±è´¥ã - **ç¨æ·åé¦**ï¼ç¨ `http://192.168.177.26:8080/` ç»å½æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼è `http://localhost:8080/` æ£å¸¸ã - **ææ¥è·¯å¾**ï¼curl ç´ååä¸ URL ç POST `/api/auth/login` æ£å¸¸è¿åï¼è¯´æå端ä¸ä»£çé½éï¼â ç¨åºç¨å æµè§å¨å¨ LAN å°åå¤ç°ï¼ç¡®å®æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼â 对æ¯åºå·®å¼åªå¨ `Origin` 头 â curl è¡¥ `Origin: http://192.168.177.26:8080` å¾å° `403 Invalid CORS request`ï¼æ ¹å è½å°ã - **æ ¹å **ï¼æµè§å¨ POST/PUT/DELETE å¿ å¸¦ `Origin`ï¼GET ä¸å¸¦ï¼ï¼9-14 è·¨åæ¶ç´§åç½åååªåäº `localhost:8080 / 127.0.0.1:8080`ï¼ç» dev-server 代ç转åè¿æ¥ç `Origin: http://192.168.177.26:8080` å½ä¸ä¸äºï¼è¢« `CorsFilter` 403 æ¦æã页颿¬èº«å `GET /api/auth/captcha-config` ä¸å¸¦ `Origin` æä»¥æ£å¸¸ï¼è¡¨ç°ä¸º"页é¢è½å¼ãä¸ç»å½å°±ç½ç»é误"ã - **顺带åç°**ï¼æå é¨ç½²ï¼å端å åµãç¨ `http://<é¨ç½²æºIP>:8090` 访é®ï¼æ¶ POST åæ ·å¸¦ `Origin: http://<IP>:8090`ï¼ä¹ä¼è¢« 403 æ¡ä½ç»å½ââå±äºåç±»éæ£ï¼æ¬æ¬¡ä¸å¹¶è§£å³ã - **æ¹å¨ï¼2 æä»¶ï¼**ï¼`CorsConfig.java` ç± `setAllowedOrigins` æ¹ä¸º `setAllowedOriginPatterns`ï¼é»è®¤æ¾è¡ `http://localhost:*`ã`http://127.0.0.1:*`ã`http://192.168.*:*`ã`http://10.*:*`ã`http://172.*:*`ï¼`application.yml` ç `app.cors.allowed-origins` åæ¥å¹¶è¡¥æ³¨éãç½ååæ ¡éªæºå¶ä¸ `allowCredentials=false` åæªæ¾æ¾ã - **éªè¯**ï¼æ PID ç²¾ç¡®åæ§å端é¾ï¼`cmd 3608 â java(maven) 23704 â java(app) 12636`ï¼åéå¯ï¼åºç¨å æµè§å¨å¨ LAN å°åå®ç»æåè¿å ¥ `#/dashboard`ï¼ç½ååè´åç¨ä¾ï¼`http://evil.example.com`ï¼ä» 403ã详è§ãåè½æµè¯æ¥å_å±åç½IP访é®ç»å½CORSä¿®å¤_2026-09-16.mdãã ## äºãæµè¯ç»ææè¦ - CORS ä¿®å¤ 12 æ¡ç¨ä¾å ¨éè¿ï¼æ£åï¼LAN æ¥æºãåæº 8090 æ¥æºãå ç½ç½æ®µæ¥æºã带令çä¸å¡æ¥å£ã颿£ OPTIONSï¼ãè´åï¼éæ³æ¥æº 403ï¼ãåå½ï¼localhost æ¥æºãæ Origin 头ï¼ã - ç宿µè§å¨ç«¯å°ç«¯ï¼`http://192.168.177.26:8080/#/login` è¾å ¥ `admin/123456` â æç¤ºãç»å½æåãâ 跳转工ä½å°ï¼é¡¶é¨æ¾ç¤º adminã - 仿¥æ å¯¼å ¥/æ°æ®åºåå ¥æä½ï¼æªåå ¥åºæ½æ¥ï¼æ¹å¨åªæ¶åè·¨åæ ¡éªï¼ä¸è§¦ç¢°æ°æ®é¾è·¯ï¼ã ## ä¸ãéçé®é¢ä¸å¾ å 1. **æ¹ç¨ååè®¿é®æ¶éè¡¥ç½åå**ï¼`app.cors.allowed-origins` é»è®¤åªè¦çæ¬æº + å ç½ç½æ®µï¼è¥å°æ¥ç¨ååæå ¬ç½ IP 访é®ï¼éæè¯¥æ¥æºï¼å«ç«¯å£ï¼è¿½å è¿å»ï¼yml 注éå·²åæï¼ã 2. `Login.vue` æææå¤±è´¥é½æç¤ºä¸ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼403/500 è¿ç±»æååºçé误ä¹è¢«å½å°"ç½ç»"ï¼ææ¥æè¯¯å¯¼ï¼å»ºè®®åç»æç¶æç ç»åæç¤ºï¼æªåï¼çç¨æ·ç¡®è®¤ï¼ã 3. 9-15 éçç»§ç»æè´¦ï¼AI å¤åè±æè¡¥é½ï¼system prompt ä¼ä¸å/è§£éåææªè±æï¼ãä¿å¯æ°æ®é¨ç½²è·¯çº¿ç¡®è®¤ã4 å¼ æç»æ¥è¡¨æ¨¡æ¿æ©åãå®¡æ ¸æ¯å¯¹åºåç¼ºå¤±ä¿æ¤ã`sys_role` æéè½å°ã3D éªè¯ç ç产å¼å¯ã`backend.log` åå²æææ¸ çã 4. ä»åºæ ¹ç®å½ä»æå¤§éæªè·è¸ªä¸´æ¶æä»¶ï¼`_*.py`/`_*.sql`/`_*.ps1` çï¼æªè¢« `.gitignore` è¦çï¼æ¸ çåéç¨æ·ç¡®è®¤ã 5. å ¬å¸ giteaï¼`61.183.254.94:3000`ï¼æ¨éä»åæ¬æºåæ®é®é¢å½±åï¼ä»æ¥æç¬¬ 3 æ¡å·¥ä½è§èå°è¯ fetch/åå¹¶/æ¨éï¼ç»æè§ä¸æ¡ git è®°å½ã ## åãæå¤©è®¡å 1. ä¸ç¨æ·ç¡®è®¤åå/å ¶ä»è®¿é®æ¹å¼æ¯å¦éè¦ä¸å¹¶å ç½ååï¼å¹¶ç¡®è®¤ `Login.vue` é误æç¤ºç»åæ¹æ¡æ¯å¦å®æ½ã 2. æ¨è¿ AI å¤åè±æè¡¥é½ï¼çº¦ 20 è¡æ¹å¨ï¼ï¼å®æååãåè½æµè¯æ¥åãï¼æ²¿ç¨"å DeepSeek æå¡æå "忥æçº§éªè¯ã 3. ç»§ç»æ¨è¿æ¥è¡¨æ¨¡æ¿æ©å / å®¡æ ¸åºåä¿æ¤çæè´¦é¡¹ã ## äºãgit è®°å½ - æ¬æ¬¡æ¹å¨ï¼`CorsConfig.java`ã`application.yml`ãæ¬æ¥å䏿¥æ¬æ¥ç»ã - æµç¨ï¼å åãåè½æµè¯æ¥åã䏿¬ã工使¥ç»ãï¼å `git fetch origin`ï¼giteeï¼`master`ï¼ä¸ `git fetch gitea`ï¼å ¬å¸ï¼`main`ï¼å¯¹æ¯åå¹¶ï¼ç¡®è®¤æ å²çªåæäº¤å¹¶æ¨éã traffic-audit-server/src/main/java/com/trafficaudit/common/config/CorsConfig.java
@@ -12,14 +12,16 @@ import java.util.List; /** * è·¨åé ç½®ï¼åªå 许é ç½®ä¸ååºçæ¥æºè®¿é®æ¥å£ã * åå端å离æ¬å°å¼åé»è®¤æ¾è¡ 8080ï¼åç«¯ç» dev-server 代çæä¸åç«¯åæºé¨ç½²æ¶åä¸éè¦é¢å¤æ¾è¡ã * è·¨åé ç½®ï¼åªå 许é ç½®ä¸ååºçæ¥æºï¼æ¯æ * éé ï¼è®¿é®æ¥å£ã * æµè§å¨åèµ· POST/PUT/DELETE æ¶ä¼å¸¦ Origin 头ï¼GET ä¸å¸¦ï¼ï¼å æ¤ç¨å±åç½ IP æå¼é¡µé¢æ¶ï¼ * è¥è¯¥æ¥æºä¸å¨æ¾è¡å表å ä¼è¢« CorsFilter å¤ä¸ºéæ³å¹¶è¿å 403ï¼è¡¨ç°ä¸ºç»å½æ¶æç¤ºâç½ç»é误âã * é»è®¤æ¾è¡æ¬æºä¸å ç½ç½æ®µçä»»æç«¯å£ï¼æ¬å°å¼åãå±åç½è®¿é®ãIP æ¹å¼è®¿é® 8090 åæºé¨ç½²é½è¦çï¼ã * 注æï¼ä¸å¼å¯ allowCredentialsï¼æ¥å£ç¨ Bearer 令çé´æï¼ä¸ä¾èµ Cookieï¼ï¼é¿å ä»»æç«ç¹æºå¸¦åè¯è°ç¨ã */ @Configuration public class CorsConfig { @Value("${app.cors.allowed-origins:http://localhost:8080,http://127.0.0.1:8080}") @Value("${app.cors.allowed-origins:http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*}") private String allowedOrigins; private List<String> originList() { @@ -29,7 +31,7 @@ @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(originList()); config.setAllowedOriginPatterns(originList()); config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept", "X-Requested-With")); config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); config.setAllowCredentials(false); @@ -43,4 +45,4 @@ public CorsFilter corsFilter() { return new CorsFilter(corsConfigurationSource()); } } } traffic-audit-server/src/main/resources/application.yml.example
@@ -70,7 +70,9 @@ # Behavior captcha on login. Set to false to skip verification during test phase; enable before production release. app: cors: # å 许跨åè®¿é®æ¥å£çæ¥æºï¼éå·åéï¼ allowed-origins: http://localhost:8080,http://127.0.0.1:8080 # å 许跨åè®¿é®æ¥å£çæ¥æºï¼éå·åéï¼æ¯æ * éé 主æºä¸ç«¯å£ï¼ï¼ # æµè§å¨ POST/PUT/DELETE å¿ å¸¦ Originï¼GET ä¸å¸¦ï¼ï¼æ ç¨ IP/ååæå¼é¡µé¢æ¶è¯¥æ¥æºå¿ é¡»å½ä¸æ¤å表ï¼å¦å 403ã # é»è®¤æ¾è¡æ¬æºä¸å ç½ç½æ®µï¼è¥éè¿åå访é®ï¼è¯·æè¯¥ååï¼å«ç«¯å£ï¼è¿½å å°æ¤å¤ã allowed-origins: http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:* captcha: required: false