【发布时间】:2021-06-01 18:39:04
【问题描述】:
我有一个在 JSP 上运行的网站,它使用外部服务进行支付。当用户付款时,他们会被重定向到外部 URL,付款完成后他们会返回。我的问题是,有时(大约 70% 的时间)当用户返回时,会话丢失(JSP 创建一个新的空会话)。 Firefox 或 IE11 不会出现此问题。
我已确认服务器 IP 在会话更改前后保持不变,因此负载平衡器不是问题。我还确认使用了response.encodeURL 和response.encodeRedirectURL(之前/之后的URL 相同),所以浏览器应该没有cookie 问题。
网站和外部服务都是在 https 上运行的,所以 cookie 的设置应该也不会造成任何问题。
有没有人知道什么可能导致这个问题? 代码实际上只是(除了 return_to 是 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>
【问题讨论】:
-
您检查过会话超时值吗? (来自tomcat)您不一定需要cookie。会话可以持续 30 或 40 分钟不活动。
标签: java google-chrome jsp session redirect