在login
上,可以使用url
中设置的flash
值将用户重定向到请求登录的页面。
是否可以使用相同的用例,将用户重定向到注销后请求注销操作的页面?
答案 0 :(得分:8)
(刚刚阐明了allenskd的评论)
很大程度上取决于您的注销是如何实现的,但如果它只是一个控制器或一个jsp,您不必将URL传递给它。您可以使用referer标题。
String refererUrl = request.getHeader("referer")
答案 1 :(得分:2)
谢谢大家对这个问题的评论,并提出Johan Sjöberg
的建议,即使stackoverflow
正在使用它;-),请查看退出链接。
在模板上
<a href="@{Secure.logout2(request.url)}">logout</a>
在Secure.java
我添加了logout2
public static void logout2(String returnUrl) throws Throwable {
flash.put("returnUrl", returnUrl == null ? "/" : returnUrl);
logout();
}
并修改了logout
public static void logout() throws Throwable {
session.clear();
response.removeCookie("rememberme");
Security.invoke("onDisconnected");
flash.success(Messages.get("secure.logout", "You have been successfully logged out"));
String returnUrl = flash.get("returnUrl");
redirect(returnUrl == null ? "/" : returnUrl);
}
答案 2 :(得分:2)
在这里发现其他答案是不可接受的(或者只是不太适合我的方法)我一直在努力,直到我想出了一些我更喜欢的东西。这是我做的:
public class Security extends Secure.Security {
/* Overrides the same method from Secure.Security.
* I only needed to redirect back the home-page so I just
* hard-coded the redirect-url here; but you could also have
* directed your logout-link to #logout2(String url) where you do a
* flash#put() and then here do a flash#get() and redirect to
* to that url instead (see n002213f's answer for more detail;
* but I thought it bad-practice to do the other half of his
* answer -- directly modifying the #logout() method of the
* play#secure-module)
static void onDisconnected() {
redirect( "/" );
}
}
index.html:
(...) <a href="logout">Logout</a> (...)
所以这里发生的是调用默认播放#secure#logout(),并在注销过程结束时触发Secure#Security#onDisconnected - 它被覆盖并重定向到主页。这样玩游戏自带的内置安全性不会被绕过,所以你不会冒险破坏你的安全性,你也不会直接修改游戏#secure-module代码,这意味着当它更新时你不会发现自己处于pickle,但你实现了结果:没有被重定向到默认播放#secure-login页面,而是直接回到主页。
如果有人更喜欢玩Play!比我看到这个问题(或者如果我对其他解决方案的批评是没有根据的话),我很乐意收听!
否则我认为这是实现目标的最优雅,最简单的方法。