后台页面登录验证码失效问题

环境:

后端通过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/ 变为 /
该问题解决。

该问题的具体原理还待探讨.....

posted @ 2020-10-27 14:55  adsakula  阅读(1189)  评论(0编辑  收藏  举报