私は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'))
しかし、残念ながら、ログイン後にこれを行うと、私のページにレンダリングされたコンテンツが複製されます。アイデアやその他の安全な解決策はありますか?
最後のページにリダイレクトする最も簡単な方法は、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コンパイラが混乱するようです。
お役に立てれば。
私はこのコントローラー側を使用しています:
redirect(uri: request.getHeader('referer') )
GSPビューファイルでは、そのように使用できます。
<g:link url="${request.getHeader('referer')}"> Back </g:link>
もう1つの方法は、現在の actionName 、 controllerName 、および 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が作成されます。