5

一部のページはhttps経由でのみアクセス可能で、一部はhttp経由でのみアクセス可能なGrailsアプリがあります。これは、beforeフィルターを使用して簡単に処理できます。ただし、httpsページでコントローラーがリダイレクトを実行するとすぐに、ユーザーはhttpに戻り、フィルターによって再びhttpsにリダイレクトされます。

def update = {
    ...
    redirect(action: "show", id: domainInstance.id)
}

Firebugでは、次のようになります。

POST ... localhost:8443 (the form submit to controller)
GET ... 302 ... localhost:8080 (the redirect to show in controller)
GET ... 301 ... localhost:8443 (the redirect back to https in filter)

現在のプロトコルなどを「記憶」するためにコントローラーリダイレクト呼び出しを取得するにはどうすればよいですか?それとも私は何か間違ったことをしていますか?

4

4 に答える 4

5

アフターフィルターを使用してこれを整理し、必要に応じて応答の「Location」ヘッダーをhttpsに変換しました。デフォルトのCachingLinkGeneratorはhttpサーバーのURLで構築され、これを使用してリンクを作成します。したがって、プロトコルを維持するための方法はないようです。また、それを自分の拡張LinkGeneratorに置き換える簡単な方法も見つかりませんでした。

class SecurityFilters {
    def filters = {
        overall(controller: '*', action: '*') {
            after = {
                String loc = response.getHeader("Location")
                if (isRequiresHttps()) {
                    response.setHeader("Location", convertToHttps(loc))
                }
            }
        }
    }
    private boolean isRequiresHttps() { ... }
    private String convertToHttps(String url) { ... }
}
于 2011-11-14T11:24:29.983 に答える
3

これはバグであり、バージョン2.0で修正されているようです。

于 2011-11-04T03:11:42.923 に答える
0

URLを手動で作成し、リダイレクトを使用することをお勧めします

手動で:

def uri = createLink(action: "show", id: domainInstance.id, absolute: false)
redirect(uri: uri)

また

def url = createLink(action: "show", id: domainInstance.id, absolute: true)
url = url.replace("http:", "https:")
redirect(url: url)
于 2011-11-02T07:43:51.747 に答える
0

SSLを実行するようにgrailsアプリをどのように構成したかわかりません。たぶんあなたはあなたのTomcatサーバーコネクタでそれを透過的に設定しましたか?

ただし、コードではSSLを気にする必要はありません。多分これは役立ちます:http ://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/

于 2011-11-02T11:55:10.690 に答える