Java 将变量从外部控制器传递到POST请求

Java 将变量从外部控制器传递到POST请求,java,post,get,playframework,Java,Post,Get,Playframework,由于你们在我进入游戏框架的早期步骤中非常有帮助(谢谢),这里再次说明: 我们有一个工作注册控制器,它将所有凭证发布到数据库 但是,我们希望能够在之后立即登录。下面是实现此功能的代码: public static void doRegistration(@Valid User user) { //registering the user try{ SecureController.authenticate(user.username, user.password

由于你们在我进入游戏框架的早期步骤中非常有帮助(谢谢),这里再次说明:

我们有一个工作注册控制器,它将所有凭证发布到数据库

但是,我们希望能够在之后立即登录。下面是实现此功能的代码:

    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
某个地方应该是action SecureController.authenticate,但我必须在发布后的列中添加什么。。。它不能是/account/register,因为它失败了


事先谢谢你

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


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

正如您所说,您尝试执行的操作是不安全的。你应该做的(不是唯一的选择,只有一种可能性)是:

  • 为用户维护当前的数据注册操作
  • 创建服务类(不继承控制器)。它可以是静态的,也可以要求实例化(不过使用静态方法就足够了)
  • 将@Before方法添加到将始终执行的公共控制器。一种方法是使用@Before方法创建一个控制器,并通过@with注释将该控制器添加到所有其他控制器中,以便对所有控制器始终执行@Before。它要求您向每个新控制器添加一个@With,但我相信它可以保持代码的整洁
其思想是控制器从服务类调用authenticate方法。这是一个简单的静态方法。此方法检查用户(如果已启用,是否具有适当的许可证,等等),并在会话中设置一些参数(通过会话对象)

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

设置会话后,您将重定向到所选内容的页面(主页面、个人资料等)。由于您有通用的@Before方法,因此将执行此操作。此方法应验证会话中的凭据(用户身份验证、许可证类型等),并采取相应的行动。您在游戏的安全控制器中有一个示例,但您可以创建自己的


这样,您可以从任何控制器使用服务的authenticate方法,允许通过多种方法进行身份验证,并使用公共点验证会话。

谢谢您的回答。实际上,我不希望GET重定向到验证用户身份的控制器。是否有某种方法可以在不将所有参数放入GET变量的情况下使用控制器执行代码?Play的思想是将所有业务逻辑放在您的模型中。如果您的doRegister方法想要执行某些特定的业务逻辑,那么只需在您的模型上调用所需的方法。如果这是不可能的,唯一的另一种方法是调用两个方法共享的非公共静态方法。非公共静态方法在控制器中不被视为操作,因此只需执行并将控制返回给调用方法即可。通过这种方式,您的控制器可以共享控制器逻辑。但是,如果我在另一个控制器中工作,那么我需要从另一个控制器访问该控制器,这需要一个公共静态方法。除非我将所有功能放在一个控制器中,但这不是正确的解决方案。。。目前我正在查看播放模块,这是否有帮助?谢谢谢谢你的详尽回答!但是我想知道,如果我实现了该服务,那么如果该服务无法扩展控制器(因此无法访问会话对象),我将如何编辑会话?我已经有了安全模块,但是我编辑了一些东西来定制一些次要的行为。所以所有的逻辑都已经存在了。。。是否有任何理由在不从控制器扩展的类中实现authenticate方法?来自Controller.java的源代码不可见:(谢谢!会话静态(注意大写字母S)允许您访问会话,而无需从Controller继承…谢谢您的回答!