【问题标题】:Session sometimes gets lost when returning from an external url in Chrome/Edge从 Chrome/Edge 中的外部 url 返回时,会话有时会丢失
【发布时间】:2021-06-01 18:39:04
【问题描述】:

我有一个在 JSP 上运行的网站,它使用外部服务进行支付。当用户付款时,他们会被重定向到外部 URL,付款完成后他们会返回。我的问题是,有时(大约 70% 的时间)当用户返回时,会话丢失(JSP 创建一个新的空会话)。 Firefox 或 IE11 不会出现此问题。

我已确认服务器 IP 在会话更改前后保持不变,因此负载平衡器不是问题。我还确认使用了response.encodeURLresponse.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


【解决方案1】:

我遇到了类似的问题。可能有两个主要原因

  1. Here我得到了解决方案。实际上,当从外部 URL 返回时,谷歌浏览器会搜索 favicon.ico。如果在页面上设置,请确保 .ico 文件可用且可访问。 1:Session data lost in Chrome only

  2. HttpCookie.SameSite 属性。谷歌已经更新了他们的属性。 Read Here更新cookie设置方法试试。希望它会有所帮助。 php中的示例

      $cookie_options = array(
       'expires' => time() + 60*60*24*30,
       'path' => '/',
       'domain' => '.domain.com', // leading dot for compatibility or use subdomain
       'secure' => true, // or false
       'httponly' => false, // or false
       'samesite' => 'None' // None || Lax || Strict
      );
      setcookie('cors-cookie', 'my-site-cookie', $cookie_options);
    

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2020-11-18
  • 2019-10-19
相关资源
最近更新 更多