将变量传递给外部控制器的POST请求

时间:2011-04-02 13:42:17

标签: java post get playframework

既然你们在我早期进入Play框架的过程中非常有帮助(感谢你的话),这里再说一遍:

我们有一个有效的注册控制器,可以将所有凭据发送到数据库。

但是,我们希望以后可以立即登录。以下是使这项工作的代码:

    public static void doRegistration(@Valid User user) {

//registering the user

    try{
        SecureController.authenticate(user.username, user.password, false, "MainController.index");
    }catch(Throwable ex){
        MainController.index();
    }

这很好用,但它非常安全,因为它获取服务器的所有凭据。我知道我必须以某种方式编辑我的路径文件,但我看不清楚。

路线档案:

*       /account                                SecureController.login
POST    /account/register                       RegistrationController.doRegistration
GET     /account/register                       SecureController.login

某处应该是动作SecureController.authenticate,但是在POST之后我必须把它放在列中......它不能是/ account / register,因为它失败了......

事先谢谢!

2 个答案:

答案 0 :(得分:2)

我不确定我理解你的问题。路径文件只是将URL配置为漂亮URL的一种方法。如果您没有指定它们,那么它将依赖于默认的{controller} / {method}语法。

您遇到的问题是,当您调用另一个控制器时,Play会执行重定向到该控制器的方法,该方法包括将请求发送回浏览器,告知其重定向(这可确保应用程序的状态反映在浏览器中的URL)。因此,重定向需要发送GET请求,并且包含在GET请求中将是您的参数。

答案 1 :(得分:1)

正如你所说,你正在努力做的事情并不安全。你应该做什么(不是唯一的选择,只有一种可能性)是:

  • 维护用户的当前doRegistration操作
  • 创建服务类(不继承Controller)。它可以是静态的或需要实例化(虽然静态方法应该足够了)。
  • 将@Before方法添加到将始终执行的公共控制器。一种方法是使用@Before方法创建一个控制器,并通过@With注释将该控制器添加到所有其他控制器,以便@Before将始终为所有控制器执行。它要求你为每个新的控制器添加一个@With,但我相信它可以保持代码非常干净。

这个想法是控制器从服务类调用authenticate方法。这是一个简单的静态此方法检查用户(如果已启用,具有适当的许可证,无论如何)并在会话中设置一些参数(通过Session对象)。

为了帮助您,您可能希望在用户中创建另一个返回要设置的属性的身份验证方法(例如,在Map中,如果它包含“错误”键,则由于某种原因无法对用户进行身份验证) 。如何执行此步骤可以根据您的要求进行更改。

设置完会话后,您将重定向到您选举的页面(主页,个人资料等)。由于你有共同的@Before方法,这将被执行。此方法应验证会话中的凭据(用户身份验证,许可证类型等)并相应地执行操作。您在Play的安全控制器中有一个示例,但您可以创建自己的。

有了这个,你可以从任何控制器使用服务的验证方法,允许通过多种方法进行验证,并使用公共点来验证会话。