Apache之后的Grails应用程序不会看到/访问手动设置的标头

时间:2015-10-30 19:27:05

标签: apache tomcat grails groovy

我的Grails 3.0.9应用程序无法在Apache的配置中查看/访问手动设置的标头。

相同的配置很好地服务于PHP(即。$_SERVER['legalGivenNames']

正在使用的网址:http://localhost:9009/test?p=abc

设置:WAMP_2.2:9009 <--> Grails3.0.9_Tomcat7:8080

Apache配置:

LoadModule headers_module modules/mod_headers.so
....
<IfModule headers_module>
    SetEnv legalGivenNames "Me"
</IfModule>
...
<VirtualHost *:9009>
    DocumentRoot "c:\wamp\www"

    ProxyPass /test http://localhost:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /test http://localhost:8080/

</VirtualHost>

我的课程:

package my.intercept

import org.grails.web.util.WebUtils
import org.slf4j.Logger;
import org.slf4j.LoggerFactory

class MyInterceptor {

    static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

    MyInterceptor(){
        matchAll()
    }

    boolean before() {
        // get current request
        def req = WebUtils.retrieveGrailsWebRequest().getCurrentRequest()
        def sess = req.getSession()

        //doesn't work, returns null
        logger.debug("getAttribute(\"legalGivenNames\") "+req.getAttribute("legalGivenNames"))

        //doesn't work, returns null
        logger.debug("getHeader(\"legalGivenNames\") "+req.getHeader("legalGivenNames"))

        //works, returns list of headers, none from Apache
        Enumeration<String> headers = req.getHeaderNames()
        if(headers == null)
            logger.debug("headers: null")
        else{
            for(String s : headers)
                logger.debug("header: "+s)
        }

        //works
        logger.debug("getHeader(\"user-agent\"): "+req.getHeader("user-agent"))

        //works - ie. ?p=abc
        logger.debug("getParameter(\"p\"): "+req.getParameter("p"))

        //works, prints alphanumeric string
        logger.debug("sess.id : "+sess.id)

        true
    }

    boolean after() { true }

    void afterView() {
        // no-op
    }
}   

控制台输出:

DEBUG my.intercept.MyInterceptor - getAttribute("legalGivenNames") null
DEBUG my.intercept.MyInterceptor - getHeader("legalGivenNames") null
DEBUG my.intercept.MyInterceptor - header: host
DEBUG my.intercept.MyInterceptor - header: user-agent
DEBUG my.intercept.MyInterceptor - header: accept
DEBUG my.intercept.MyInterceptor - header: accept-language
DEBUG my.intercept.MyInterceptor - header: accept-encoding
DEBUG my.intercept.MyInterceptor - header: cookie
DEBUG my.intercept.MyInterceptor - header: cache-control
DEBUG my.intercept.MyInterceptor - header: x-forwarded-for
DEBUG my.intercept.MyInterceptor - header: x-forwarded-host
DEBUG my.intercept.MyInterceptor - header: x-forwarded-server
DEBUG my.intercept.MyInterceptor - header: connection
DEBUG my.intercept.MyInterceptor - getHeader("user-agent"): Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
DEBUG my.intercept.MyInterceptor - getParameter("p"): abc
DEBUG my.intercept.MyInterceptor - sess.id : BE7DD4380AED7DA61F838DB8E999D427   

更新#1

我导出了一个WAR并部署在Tomcat8中。我重写了Apache ReverseProxy并且标题没有通过。

更新#2

我也尝试过Apache配置中的以下组合:

RequestHeader set customheaderA "trololo"
Header add customheaderB "hahaha"

两者都没有出现。

更新#3

使用PHP作为比较,它只会看到使用SetEnv设置的标头。它似乎忽略了RequestHeaderHeader Apache命令。

2 个答案:

答案 0 :(得分:1)

如果您使用AJP协议代理对Tomcat的请求,则SetEnv非常有用。 AJP协议支持代理env.variables - &gt; Servlet请求属性与HTTP标头分开。请注意,您必须按照a naming convention(&#34; AJP _ *&#34;)才能使用此功能来使用mod_proxy_ajp。

如果您通过HTTP代理,则使用请求标头是您唯一的选择。 (你已经找到了how to configure them)。

答案 1 :(得分:0)

显然,今天早上RequestHeader set testHeader "value"有效。希望在提出赏金之前它会有用。