Grails перенаправляет при переключении контроллера с https на http. Зачем? - PullRequest
5 голосов
/ 02 ноября 2011

У меня есть приложение Grails, некоторые страницы которого доступны только через https, а некоторые - через http.Это легко сделать с помощью фильтра перед.Однако, когда на странице 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 голосов
/ 14 ноября 2011

Я разобрался с этим, используя фильтр after, чтобы преобразовать заголовок «Location» в ответе на https при необходимости.CachingLinkGenerator по умолчанию создается с URL-адресом http-сервера и использует его для создания ссылок.Так что, похоже, нет способа заставить его соблюдать протокол.Я также не мог найти простой способ заменить его своим собственным расширенным 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) { ... }
}
3 голосов
/ 04 ноября 2011

Это ошибка, и она исправлена ​​в версии 2.0

0 голосов
/ 02 ноября 2011

Я не уверен, как вы настроили ваше приложение Grails для запуска SSL.Может быть, вы настроили его прозрачно в соединителе сервера Tomcat?

Однако в вашем коде вы не должны заботиться о SSL или нет.Может быть, это поможет: http://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/

0 голосов
/ 02 ноября 2011

Я бы предложил создать ваш URL вручную и использовать перенаправление с этим

Вручную как в:

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

OR

def url = createLink(action: "show", id: domainInstance.id, absolute: true)
url = url.replace("http:", "https:")
redirect(url: url)
...