如何在url中传递参数而不在playframework中显示url

时间:2016-04-05 08:39:52

标签: scala playframework scala-2.11

在我的控制器中我有两个操作ActionAActionB,在ActionA我有一个字符串,我想发送给ActionB因为我这样做此

 object MyController extends Controller {

    def ActionA= Action {
       var str="abc"
          Redirect(controllers.routes.MyController.ActionB(str))
      }

    def signupProcessing1(token:String)= Action {
        Ok("string is " + token)   
      } 
    }
路径文件中的

GET    /user/actionB controllers.MyController.ActionB(token:String)  

GET   /user/actionA  controllers.MyUserController.ActionA

当我在浏览器中点击localhost:9000/user/actionA时 它被重定向到这个网址

localhost:9000/user/actionB?token="abc"

我不想在我使用POST代替GET的网址中显示此字符串“abc”

POST    /user/actionB controllers.MyController.ActionB(token:String)  

GET   /user/actionA  controllers.MyController.ActionA

但是它给出了例外

`Action not found` 

    For request 'GET /user/actionB?token=abc'

请帮助我如何在不显示网址

的情况下将参数从一个操作传递到另一个操作

1 个答案:

答案 0 :(得分:3)

重定向的HTTP规范并不意味着将方法从GET更改为POST。

但是你可以采取一些措施来解决问题。

最简单的方法是不重定向,只需转发到您的操作:

  def ActionA = {
    val str = "abc"
    ActionB(str)
  }

  def ActionB(token: String) = Action {
    Ok("string is " + token)
  }

在这种情况下,URL将保留为ActionA

另一种方法是使用cookie

  def ActionA = Action {
    val str="abc"
    Redirect(controllers.routes.MyController.ActionB).withCookies(
      Cookie("token", str))
  }

  def ActionB = Action { r =>
    r.cookies.get("token") match {
      case Some(cookie) =>
        val token = cookie.value
        Ok("string is " + token)
      case _ => Unauthorized
    }
  }

在这种情况下,网址将更改为ActionB

如果您对身份验证和授权实施感兴趣,可以在这里查看其中一些