【问题标题】:Spring webflow full query string in ELEL中的Spring webflow完整查询字符串
【发布时间】:2012-09-26 20:49:20
【问题描述】:

简而言之,如何在 webflow 视图 jsp 中使用 EL 获取完整的查询字符串?这就是我想要做的:

<span class="forgot-password">
  <a href="forgotPasswordRequest?<%=request.getQueryString() %>">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

除了我想使用 EL 而不是 scriptlet &lt;%=request.getQueryString() %&gt;。使用${param.someParameterName} 获取任何单个参数似乎很容易,但我想要整个事情。更具体地说,我使用 CAS 作为 SSO 提供程序。为了进行身份验证,应用程序将使用包含参数service 的查询字符串将其登录重定向到CAS,该参数是成功身份验证后要返回的URL。像这样的:

?service=http%3A%2F%2Fmysite.com%3A9080%2Fwelcome

我的 CAS 登录页面有一个忘记密码 webflow 的链接。我需要将该服务参数传播到其他网络流。所以我可以这样做:

<span class="forgot-password">
  <a href="forgotPasswordRequest?service=${param.service}">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

但是我失去了所有的 URL 转义。此外,如果将来我想保留其他参数,它们也会丢失。

scriptlet 目前可以工作,但它很难看,而且我不喜欢在我的演示文稿中包含代码(因为这是真正的 java 代码),即使它是微不足道的。 EL 无疑是一个更优雅的解决方案。

我查看了spring documentation 中列出的所有特殊 EL 变量,但仍然无法找到获取完整查询字符串的方法。

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

好的,所以我正在做一些基础......原来ExternalContext 接口有一个getNativeRequest(),它是实际的HttpServletRequest 对象。从那里我可以得到完整的查询字符串:

externalContext.getNativeRequest().getQueryString()

所以现在我假设由于有一个名为 externalContext 的 特殊 EL 变量,我会这样做:

${externalContext.nativeRequest.queryString}

对吗?错误的!事实证明,externalContext 变量在 JSP 页面中不可用。有谁知道为什么?但是,还有flowRequestScope,它对JSP 可用并且有getExternalContext 方法,所以现在我可以这样做了:

${flowRequestScope.externalContext.nativeRequest.queryString}

酷,这行得通……但为什么有必要呢?为什么只有一些 特殊 EL 变量 被推送到 JSP 页面,为什么其中一些会发生变化(viewScope 似乎将其所有值都提升到了根级别,所以 viewScope.commandName在 JSP EL 中被引用为 ${commandName})?我一定遗漏了 WebFlow 工作方式中的一些基本内容。有人能指出我正确的方向吗?

【问题讨论】:

    标签: java spring spring-mvc spring-webflow-2


    【解决方案1】:

    在 webflow 中,范围图本质上是为了便于区分服务器上的控制逻辑。在直接的 Spring MVC 中,这将是您的控制器,但在 webflow 中,您的流程或多或少直接用于此目的。实际上,您放入范围映射中的所有内容都会汇总到请求属性中以在 JSP 上使用,但请求范围除外,该范围在流程返回时被显式销毁。这就是为什么 viewScope.commandName 在 JSP 中可用的原因——因为它与其他范围一样,被汇总到一个大型请求属性映射中,然后将其放入请求中以供您的 JSP 访问。

    不同之处在于首先使用寿命较低的作用域。较低的作用域总是优先于寿命较长的作用域,就像 Java 中的局部变量优先于同名的类级变量一样。因此,您需要确保使用唯一的参数名称以防万一,以免发生冲突。

    如果您确实需要该值,最简单的方法是在流程中使用 set 标记将该值设置在适当的范围内,以便您更轻松地命名它,例如

    <set name="viewScope.currentService" value="externalContext.nativeRequest.queryString" />
    

    这样您就可以在视图范围内使用 EL 变量“currentService”。您可能希望使用 on-render 或 on-entry 将此值存储到您的视图中。对于这个特定的值,我可能会使用 on-render,因为它可能会根据视图的呈现方式而改变,但无论哪种方式都可能无关紧要。

    【讨论】:

    • 是否有任何文档(没有阅读源代码)指定如何以及将哪些值汇总到请求映射中? externalContext 中的值是否也会汇总,以便我可以尝试类似${nativeRequest.queryString} 的方法?
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2011-02-21
    相关资源
    最近更新 更多