Grails重定向控制器从https切换到http。为什么?

时间:2011-11-02 07:26:05

标签: java grails grails-controller

我有一个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 个答案:

答案 0 :(得分:4)

我通过使用后置过滤器将其排序,以便在需要时将响应中的“位置”标头转换为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) { ... }
}

答案 1 :(得分:3)

这是一个错误,似乎已在2.0版中修复

答案 2 :(得分:0)

我建议手动构建您的网址并使用重定向

手动,如:

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)

答案 3 :(得分:0)

我不确定您是如何配置grails应用程序来运行SSL的。也许您已经在tomcat服务器连接器中透明地配置了它?

但是,在您的代码中,您不应该关心SSL。也许这会有所帮助:http://www.juliesoft.com/2010/04/automatic-httphttps-switching-with-grails/