如何在Grails中隐藏URL参数

时间:2011-10-14 06:52:13

标签: grails groovy

当用户创建新的Load对象时,如果用户选中“已付款已付款”复选框,则会在新{{1}之后立即将其重定向到Payment控制器} 已经被创造了。创建新Load所需的一些参数也用于创建新的Load,因此我只需在重定向中传递参数,如下所示:

Payment

这很好用,但它给了我一个真实讨厌的URL,其中包含所有参数。 如何将我的参数传递给其他控制器并防止它们出现在网址中?

更新

我应该说,我感谢大家对这个小问题的建议。即使提出了所有建议,在redirect(controller: "payment", action: "create", params: params) 调用中手动构建参数映射仍然是我想要避免的最佳方式。这不是什么大不了的事,特别是因为只有少数几个参数,我只是不相信没有一种更清洁,更自动化的方法来解决这个问题。

redirect

5 个答案:

答案 0 :(得分:4)

您可以执行服务器端转发而不是重定向。只需更换:

redirect(controller: "payment", action: "create", params: params)

使用:

forward(controller: "payment", action: "create", params: params)

更新

要解决您在评论中描述的刷新问题,请将您转发的操作发送重定向(而不是渲染视图),例如

class PaymentController {

  def create = {

    Integer paymentId = // Create a payment and get it's ID    
    redirect(action: 'show', id: paymentId)    
  }

  def show = {
    def id = params.id
    // show the payment with this ID
  }
}

答案 1 :(得分:3)

  1. 通过会话参数传递
    1. 使用HTTP请求服务器端而不是重定向,然后将结果呈现给客户端

答案 2 :(得分:1)

可以使用flash对象来实现这一点(尽管我会按原样保留实现)。

将所有参数复制到flash。

params.each {
  flash[it.key]=it.value
}

在“创建”操作中使用flash地图而不是params地图。

答案 3 :(得分:0)

我没试过,但我认为它会解决你的问题。

redirect(controller: "payment", action = [POST:"create"], params: params)

答案 4 :(得分:0)

这是另一个建议: - )

保持从加载到付款的重定向不变。如果您收到使用params的呼叫,请检查付款操作,然后将其保存在会话或闪存中,并重定向到没有参数的相同操作。使用putAll从会话/ flash恢复参数并继续操作。

有点像后重定向 - 获取付款,但实际上是GetWithParams-Redirect-Get。结果是干净的URL,没有刷新问题。

我在应用中使用它来获取干净的网址,并将状态保存在应用的不同部分(但由于您不需要后者,因此应删除它或将其保存在闪存中)。