当从Chrome/Edge中的外部url返回时,java会话有时会丢失
我有一个运行在JSP上的网站,它使用外部服务进行支付。当用户付款时,他们被重定向到外部url,当付款完成时,他们返回。我的问题是,有时(大约70%的时间)当用户返回时,会话丢失(JSP创建一个新的空会话)。 Firefox或IE11中不会出现此问题
我已经确认服务器IP在会话更改前后保持不变,因此负载平衡器不是问题所在。我还确认使用了response.encodeURL
和response.encodeRedirectURL
(前后URL相等),因此浏览器应该不会出现cookie问题
网站和外部服务都在https上运行,因此cookie设置也不会导致任何问题
有人知道是什么导致了这个问题吗? 代码实际上是正确的(除了返回是url编码的)
response.sendRedirect("https://paymentservice.com/pay?token=asd&return_to=https://mywebsite.com/finishtransaction.jsp");
会话被配置为粘滞,只有像上面那样的外部链接才会重置会话。 我无法用URL缩短器(tinyurl)重现该问题:
<%
out.println(session.getId() + "<br>");
out.println(request.getParameter("step") + "<br>");
%>
<script type="text/javascript">
function redirect_window(redirectUrl){
if((window.opener && !window.opener.closed)){
window.opener.location.href = redirectUrl;
window.open('about:blank','_self').close();
}else{
window.close();
location.href=redirectUrl;
}
}
setTimeout(function() {
<c:if test="${param.step == null}">
var options;
if (navigator.appName.charAt(0)=='M'){
options = "fullscreen=1,scrollbars=yes";
}else if (navigator.appName.charAt(0)=='N'){
options = "left=0,top=0"
+ ",width=" + screen.width
+ ",height=" + screen.height
+ ",scrollbars=yes";
}
window.open("/test_session.jsp?step=1","test",options);
</c:if>
<c:if test="${param.step == 1}">
redirect_window("/test_session.jsp?step=2");
</c:if>
}, 3000);
</script>
# 1 楼答案
我也面临着类似的问题。有两个主要原因
Here我找到了解决办法。实际上谷歌chrome搜索favicon。从外部URL返回时的ico。一定要保证安全。如果在第页上设置,则ico文件可用且可访问1:Session data lost in Chrome only
HttpCookie。SameSite财产。谷歌已经更新了他们的财产Read Here更新cookie设置方法并重试。希望这会有帮助。php中的示例