環境:
后端通過Servlet生成驗證碼圖片返回給前端,同時將驗證碼的字符串格式保存到Session中,sessionId作為key。
前端第一遍通過servlet請求得到驗證碼的圖片格式,第二遍通過Servlet請求得到session中的字符串形式,同時驗證該二維碼是否過期(有效)。
前端Vue框架,通過代理進行servlet的請求。
問題
與前端進行聯調時,前端兩次請求的sessionid不同,導致第二次的Servlet請求為空,並且登錄接口中驗證碼也無法校驗成功。
處理過程
在web.xml中加入Tomcat的跨域過濾器
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>10</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
加入允許跨域的設置后,該問題依舊沒有解決。
在谷歌瀏覽器中查看兩次請求中攜帶的cookie,結果如下
瀏覽器提示該cookie被攔截了
原因如下:此 Cookie 被阻止, 因為它的路徑不是請求 URL 路徑的完全匹配或超級目錄。
於是,獲取該問題的出現於 Cookie的path相關,於是更改了項目的路徑。
將項目的路徑從 /sdrs_xjyy/ 變為 /
該問題解決。
該問題的具體原理還待探討.....