0

Grails アプリでは、次のようにユーザーが選択した言語 (URL に追加された "...?lang=xx_XX") を正常に取得しています。

def locale = RequestContextUtils.getLocale(request)

springsecurity を使用して、正常に動作する特別なログアウト ハンドラーをセットアップしました

grails.plugins.springsecurity.logout.handlerNames = ['securityContextLogoutHandler', 'myLogoutHandler']

myLogoutHandler でユーザーが選択したロケールを取得する必要がありますが、以下は機能しません (ユーザーが選択したロケールではなく、ブラウザーのデフォルトのロケールのみが表示されます)

class MyLogoutHandler implements LogoutHandler {
    void logout(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) {
        def locale2 = RequestContextUtils.getLocale(httpServletRequest);
    }
}

また、次の方法でセッション ロケールを取得しようとしました。

RequestContextHolder.currentRequestAttributes().getProperties()

しかし、それは同じ結果をもたらします。MyLogoutHandler からロケールを取得する方法を知っている人はいますか?

4

2 に答える 2

1

回避策

セッションは spring-security によってクリアされたように見えますが、パラメーターを送信することはできます。

だから私が得たログアウトページのコントローラーで:

def index = {
    def myParam = "bar"
    redirect(uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl + "?foo=" + myParam) // '/j_spring_security_logout'
}

そして、LogoutHandler でパラメーターを取得するだけです。

void logout(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) {
    def myParam = httpServletRequest.parameterMap.get("foo")[0]
    ....
}
于 2012-09-20T14:49:28.663 に答える
0

以下のコードを使用してロケールを取得できます。

class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {

    private static final ThreadLocal<Authentication> AUTH_HOLDER = new ThreadLocal<Authentication>()

    void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        AUTH_HOLDER.set authentication

        // reading locales...
        request.locales.each {locale ->println locale.toString()}

        try {
            super.handle(request, response, authentication)
        }
        finally {
            AUTH_HOLDER.remove()
        }
    }

    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = AUTH_HOLDER.get()

        String url = super.determineTargetUrl(request, response)

        // do something with the url based on session data..

        url
    }
}
于 2012-09-20T13:07:49.583 に答える