环境:
后端通过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/ 变为 /
该问题解决。
该问题的具体原理还待探讨.....