Grails 2.4.2(Ubuntu Tomcat7)中Spring Security登录后重定向至IP的问题
解决Grails 2.4.2登录后重定向至IP地址的问题
我之前也碰到过Grails 2.x在Tomcat下部署后重定向到IP的坑,结合你的场景,给你几个排查和解决的方向:
1. 修正Tomcat Connector配置
Tomcat默认会用自身绑定的IP生成重定向URL,你需要在$TOMCAT_HOME/conf/server.xml的Connector节点里添加代理相关参数,告诉Tomcat真实的域名和协议:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" scheme="https" <!-- 用HTTPS填https,HTTP填http --> proxyName="www.app.com" proxyPort="443" <!-- HTTPS对应443,HTTP对应80 --> />
如果你的Tomcat前面有反向代理(比如Nginx),还得开启RemoteIpValve来解析代理传递的头部,在server.xml的Engine节点下添加:
<Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="127.0.0.1" <!-- 填写你的反向代理服务器IP --> remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" />
2. 完善Grails配置(不止grails.serverURL)
除了把grails.serverURL改成带协议头的完整地址:grails.serverURL = "https://www.app.com",还要检查Config.groovy里的Spring Security相关配置:
- 确认
grails.plugin.springsecurity.successHandler.defaultTargetUrl没有硬编码IP,改成相对路径或者用${grails.serverURL}/xxx拼接 - 检查控制器里的重定向逻辑,别用
request.serverName这种依赖请求上下文的变量,尽量用Grails自带的createLink标签或者基于grails.serverURL生成URL
3. 检查反向代理(如果存在)的配置
如果你的应用是通过Nginx等反向代理对外提供服务,必须确保代理传递了正确的Host头部,比如Nginx配置里要加:
location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; }
只有这样Tomcat才能拿到真实的域名www.app.com,而不是自己的内网IP。
4. 清理缓存并重新部署
有时候Grails的编译缓存或者Tomcat的旧war包缓存会导致配置不生效,按以下步骤操作:
- 在Grails项目根目录执行
grails clean,再重新打包war包:grails war - 停止Tomcat,删除
$TOMCAT_HOME/webapps下的旧应用目录和war包,把新的war包放进去 - 启动Tomcat,测试登录重定向是否正常
内容的提问来源于stack exchange,提问作者DevThapa
相关产品推荐
相关产品推荐

