gpt4 book ai didi

java - Spring webflow externalRedirect 重新启动相同的流程

转载 作者:行者123 更新时间:2023-12-02 07:29:15 26 4
gpt4 key购买 nike

我正在使用 CAS,刚刚从 3.4.8 更新到 3.5.1。我认为我已经处理了上千个更改中的大部分。然而,完成后的 externalRedirect 似乎不知何故被破坏了。它只是循环回到登录网络流程的开头。怎么会发生这种事?

这是即将达到的最终状态:

  <!-- The "redirect" end state allows CAS to properly end the workflow while 
still redirecting the user back to the service required. -->
<end-state id="redirectView"
view="externalRedirect:${requestScope.response.url}" />

我知道它已经达到了,因为我在这个方法中设置了一个断点(org.springframework.webflow.action.ExternalRedirectAction):

protected Event doExecute(RequestContext context) throws Exception {
String resourceUri = (String) this.resourceUri.getValue(context);
context.getExternalContext().requestExternalRedirect(resourceUri);
return success();
}

如果我在此方法返回之前检查 resourceUri 的值,我会看到该请求应重定向到的 uri:

http://mycompany.com:8080/c/portal/login?redirect=%2Fweb%2Fguest%2Fhome&ticket=ST-4-jVOtEEZcy9bXdb4xiV3l-cas

但是,如果我只是从该断点运行,而不是被重定向到该页面,则相同的登录网络流程会重新开始。这里发生了什么?我应该去哪里看?有关调试的任何提示吗?

----------------更新--------------

因此,在对代码进行 0 次修改后,只需添加一些额外的断点,现在它可以按预期工作。我不知道这里发生了什么,但我终于找到了实际重定向发生的地方。对于那些感兴趣的人,重定向发生在:

org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handleFlowExecutionResult(
FlowExecutionResult result, ServletExternalContext context,
HttpServletRequest request, HttpServletResponse response, FlowHandler handler)

最佳答案

看起来这个线程已经 hibernate 了一段时间,但我想为将来可能出现的任何人提供一些信息。以下解释来 self 使用 CAS 4.0.1 的经验。如果这不适用于旧版本,我会感到震惊......

这里首先要检查的是您的身份验证过程是否发生得相对较慢。例如,如果您是通过 VPN 链接或其他方式访问身份验证数据库的开发人员。或者,如果您的身份验证查询(和票证存储)相对较慢......

如果这适用于您,我在 CAS 中发现了一个问题,它以一种奇怪的方式与 Tomcat 交互,从而表现出上述行为。

CAS 中的问题出在名为 TerminateWebSessionListener 的 Web 流监听器中。这似乎是试图通过在流程完成后快速使 session 过期来保持较低的内存使用量。问题是,它的实现非常天真。它只是获取 session 并设置 2 秒的“最大非 Activity 间隔”(默认情况下 - 您可以使用 timeToDieInSeconds 中 TerminateWebSessionListener 的 cas-servlet.xml 属性更改此设置。)

与 Tomcat 的交互是这样的:Tomcat 仅在请求中第一次访问 session 时才标记 session 的“上次访问”时间。 但是,每次检索 session 时,都会根据当前时间检查上次访问时间,以确定是否已过失效间隔。

所以发生的事情是 TerminateWebSessionListener 期望 HttpSession.setMaxInactiveInterval(2)使 session 在该时刻之后 2 秒失效。它真正告诉 Tomcat 要做的是在当前请求中第一次访问 session 之后 2 秒使 session 失效。 如果您的身份验证/登录请求花费的时间超过 2 秒,那么,下次有人在同一请求中提出请求时,您的 session 就会失效。不幸的是,这确实发生在 Spring WebFlow 本身内。所以这里有一个竞争条件。

我将进一步考虑这个问题,并希望向 CAS 团队提出修复建议。同时,您可以在 cas-servlet.xml 中禁用 TerminateWebSessionListener ,或者您可以泵其 timeToDieInSeconds最多为您期望的值,该值比完成身份验证请求所需的时间要长。也许30秒?这样做似乎是合理的。它似乎不是一种安全措施,只是一种节省内存的措施。

代码引用:

  • CAS 4.0.1
    • TerminateWebSessionListener.java:33 ( sessionEnded() )
      • CAS 在此处设置 session 失效间隔。
  • Tomcat 7.0.55:
    • Request.java:338(session实例变量。)
      • Tomcat 在请求期间存储 session 。
    • Request.java:2899 ( doGetSession() )
      • session 提前返回,无 access()如果已经缓存在请求上。
    • Request.java:2921 ( doGetSession() )
      • 首次访问请求时,会查找 session ,access()调用并缓存请求。

(注意:StandardSession.access() 只是用上次访问时间 System.currentTimeMillis() 来标记 session 。)

关于java - Spring webflow externalRedirect 重新启动相同的流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com