我的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
设置的标头。它似乎忽略了RequestHeader
和Header
Apache命令。
答案 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"
有效。希望在提出赏金之前它会有用。