web-dev-qa-db-ja.com

Grailsアプリで最後にアクセスしたページにリダイレクトするにはどうすればよいですか?

私はGrailsの初心者であり、多くの単純な問題に苦しんでいます。

たとえば、ページの上部レイアウトに表示されているテンプレートビューからログイン/ログアウトしたときに、最後にアクセスしたページに戻る適切な方法を見つけることができませんでした。

この問題を解決するための最後の試みは、ログアウトアクションに送信されたパラメーターに$ {params.controller}と$ {params.action}を保存し、その後リダイレクトすることでした。まあ...これでも失敗しました。 gspスニペットは次のとおりです。

<g:link controller="user" action="logout" params="[currentController: ${params.controller}, currentAction: ${params.action}]">Logout</g:link>

この最後のコード行は、次の例外をスローします。

ERROR errors.GrailsExceptionResolver  - Error evaluating expression [[currentController: ${params.controller}, currentAction: ${params.action}]]

だから私の質問は:

1-ログイン/ログアウトアクションの後に最後にアクセスしたページをリロードするにはどうすればよいですか?

2-上記のコードから例外があるのはなぜですか?

ありがとうございました

編集:質問#2に関して、次のコードが機能しているようです:

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

しかし、私はその理由を本当に理解していません...

EDIT2:最後にアクセスしたページにリダイレクトするための解決策も見つけました:

redirect(url: request.header('referer'))

しかし、残念ながら、ログイン後にこれを行うと、私のページにレンダリングされたコンテンツが複製されます。アイデアやその他の安全な解決策はありますか?

26
fabien7474

最後のページにリダイレクトする最も簡単な方法は、URIを直接使用することです。

<g:link controller="user" action="logout" params="[targetUri: (request.forwardURI - request.contextPath)]">Logout</g:link>

request.forwardURIはブラウザに表示される完全なURLであり、request.contextPathはアプリのコンテキストを表すURL部分です。例: " http:// localhost:8080/yourApp "-したがって、フォワードURIからコンテキストパスを削除した結果は、アプリ相対URIになります(例:"/mycontroller/myaction ")

ログアウトアクションでは、次のURIにリダイレクトするだけです。

def targetUri = params.targetUri ?: "/"
redirect(uri: targetUri)

AFAIK、リファラーの使用は完全に安全ではありません。これは、ユーザーエージェント(ブラウザー)がリファラーHTTPヘッダー(無効になっている可能性があります)を追加することに依存しているためです。

2番目の質問について:Grailsは、GSPのリストまたはマップ属性値をGroovy式として自動的に解釈します。したがって、この

<g:link controller="user" action="logout" params="[currentController: params.controller, currentAction: params.action]">Logout</g:link>

と同等です

<g:link controller="user" action="logout" params="${[currentController: params.controller, currentAction: params.action]}">Logout</g:link>

この式の一部を${...}で再度ラップすると、GSPコンパイラが混乱するようです。

お役に立てれば。

17
Daniel Rinser

私はこのコントローラー側を使用しています:

    redirect(uri: request.getHeader('referer') )
36
nclu

GSPビューファイルでは、そのように使用できます。

<g:link url="${request.getHeader('referer')}"> Back </g:link>
3
elixir

もう1つの方法は、現在の actionNamecontrollerName 、および params を使用して createLink でURLを作成することです。

<g:link controller="user" action="logout" params="[targetUri: createLink(controller: controllerName, action:actionName, params:params, absolute:true)]">Logout</g:link>

absolute:trueがあるため、これにより絶対URLが作成されます。

0
cweston