注销后重定向到上一个URL

时间:2011-02-06 12:14:10

标签: java security playframework

login上,可以使用url中设置的flash值将用户重定向到请求登录的页面。

是否可以使用相同的用例,将用户重定向到注销后请求注销操作的页面?

3 个答案:

答案 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!比我看到这个问题(或者如果我对其他解决方案的批评是​​没有根据的话),我很乐意收听!

否则我认为这是实现目标的最优雅,最简单的方法。