Grails 4应用新环境部署问题:Tomcat请求被错误添加.jsp后缀
问题排查与解决建议
核心问题定位
请求/OurApp/loginStatus/本应触发Grails Controller的defaultAction(映射到index方法),但新Tomcat环境中被解析为寻找/loginStatus/index.jsp,说明Tomcat的默认资源解析逻辑优先于Grails的DispatcherServlet处理了该请求。
可能原因与解决步骤
1. 调整Tomcat默认页解析优先级
Tomcat默认会对以/结尾的目录请求自动查找welcome-file-list中配置的文件(如index.jsp、index.html),这会抢占Grails的请求处理:
- 编辑应用的
web.xml,修改<welcome-file-list>,将Grails的入口页面(如index.gsp)放在最前面,或者移除index.jsp:<welcome-file-list> <welcome-file>index.gsp</welcome-file> </welcome-file-list> - 优先修改应用自身配置,不推荐全局修改Tomcat的
conf/web.xml。
2. 确保Grails DispatcherServlet优先处理请求
检查应用web.xml中DispatcherServlet的映射规则,确保它能捕获所有请求:
- 确认DispatcherServlet的
url-pattern为/*(Grails默认配置),保证所有请求先经过Grails调度器:<servlet-mapping> <servlet-name>grails</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> - 若存在其他servlet(如JSP servlet)的映射规则,确保Grails的servlet映射顺序在前面。
3. 检查Grails URL映射配置
确认grails-app/conf/UrlMappings.groovy中无冲突规则,可添加显式映射确保defaultAction生效:
class UrlMappings { static mappings = { "/loginStatus/"(controller: "loginStatus", action: "index") // 其他规则... } }
4. 远程环境调试方案(无调试工具时)
- 在
LoginStatusController的index方法中添加日志,确认是否被调用:def index() { log.info("LoginStatusController index method triggered") render([success: true] as JSON) } - 临时测试请求路径
/OurApp/loginStatus/index,若能正常返回,可进一步验证是defaultAction的映射问题。 - 调整Tomcat的
RequestDumperFilter配置,增加请求过滤链的执行顺序日志,确认请求是否经过Grails的DispatcherServlet。
验证步骤
- 应用配置修改后重启Tomcat。
- 发送
/OurApp/loginStatus/请求,检查日志是否显示LoginStatusController的index方法被调用,且返回正确的JSON响应。
内容的提问来源于stack exchange,提问作者tylerwal
相关产品推荐
相关产品推荐

