Java 在playframework中登录后的页面

Java 在playframework中登录后的页面,java,login,playframework,page-flow,Java,Login,Playframework,Page Flow,在我的戏里!应用程序,我已经对控制器进行了编码。安全性为 class Security extends controllers.Secure.Security { ... static void onDisconnected() { Application.index(); } static void onAuthenticated() { User user = User.find("byEmail",Security.connecte

在我的戏里!应用程序,我已经对控制器进行了编码。安全性为

class Security extends controllers.Secure.Security {
...
   static void onDisconnected() {       
       Application.index();
   }
   static void onAuthenticated() {
      User user = User.find("byEmail",Security.connected()).first();
      if(user.isAdmin()) {
         Admin.index();
      }else {
          System.out.println("onAuthenticated()::user not admin");
   }
}
我已将路线设置为

GET     /admin/?              Admin.index
*       /admin                module:crud
GET     /                    Application.index
当我在一个页面上(比如pageX)并单击登录链接时,登录表单就会出现,我可以登录。如果我以管理员身份登录,它会将我带到admin.index()并进而带到admin/index.html视图。到目前为止,一切正常

但是,当我在pageX上,单击login链接时,我希望返回pageX。相反,调用Application.index()方法,我被带到Application.index.html。。 这是预期的行为吗? 登录后,我必须做什么才能进入pageX

更新:

我尝试使用安全控制器中的@Before将url存储在flash中

class Security extends controllers.Secure.Security {
   @Before
   static void storeCurrentUrl() {
      System.out.println("storeCurrentUrl()");
      flash.put("url", "GET".equals(request.method) ? request.url : "/");
   }
   static boolean authenticate(String username, String password) {
   ...
   }

   static void onAuthenticated() {
      ...
      String url = flash.get("url");
      System.out.println("url="+url);
      if(!user.isAdmin()) {
         if(url!=null) {
        System.out.println("url not null");
        redirect(url);
     }else {
       System.out.println("url null  ..go to /");
       redirect("/");
    }
      }
   }
当我登录时,我得到这些终端输出

url=null
url null  ..go to /
index()
我已将登录/注销链接放在main.html模板中,该模板由所有其他页面继承

<div id="main">
    <div class="auth">
     <a href="@{Admin.index()}">Go to Admin Area</a><br/><br/>
     <a href="@{Secure.login()}">Login</a><br/><br/>
     <a href="@{Secure.logout()}">Log out</a>
</div>






在您的控制器中,在调用“login()”之前,将“url”放入flash中,如下所示:

flash.put("url", "GET".equals(request.method) ? request.url : "/");
成功登录后,获取“url”并重定向

String url = flash.get("url");
redirect(url); //you may redirect to "/" if url is null

这将是预期的行为,因为这是设置路由的方式。单击登录并重定向到Application.index或Admin.index(如果是Admin用户)

如果要检索单击登录链接的页面,可以将当前操作添加到登录链接,并在验证后重定向到此操作

例如,登录链接:GET/login?action=Application。有些东西会带您进入登录页面
然后将操作另存为登录表单中的隐藏字段。当您对用户进行身份验证时,将呈现该操作。

当您尝试在未登录的情况下访问受保护的页面时,Play已重定向到原始url

如果你想重用它,你可以把你的url放在flash范围内的“onAuthenticated”方法中。在源代码中,根据“url”值的值,在调用“redirectToOriginalURL”之后播放调用


感谢您的回复。但是,当我尝试此操作时,我得到的url为null。似乎@Before未执行。我已更新了问题。请看一看。若要调用@Before方法,它应该是定义传入操作的同一控制器的一部分。此处storeCurrentUrl()不在定义login()操作的控制器中。因此storeCurrentUrl()将永远不会被调用。您的案例将有点棘手,因为Play是无状态的,它永远不会将url存储到当前页面(pageX),以便在下次请求时引用。一种方法是(尽管我觉得它有点偏离了轨道),每当该页面被传递时,您可以将当前页面url保存在flash中,以便在下一个请求时(身份验证失败时)在flash中重定向。当您到达onAuthenticated()时,request.url将是login()表单操作:)
static void onAuthenticated() {
    flash.put("url", "GET".equals(request.method) ? request.url : "/");
}