有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当从Chrome/Edge中的外部url返回时,java会话有时会丢失

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

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

  1. # 1 楼答案

    我也面临着类似的问题。有两个主要原因

    1. Here我找到了解决办法。实际上谷歌chrome搜索favicon。从外部URL返回时的ico。一定要保证安全。如果在第页上设置,则ico文件可用且可访问1Session 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);