grails 2.0 - 正确使用 serverURL 进行生产?
Posted
技术标签:
【中文标题】grails 2.0 - 正确使用 serverURL 进行生产?【英文标题】:grails 2.0 - correct use of serverURL for production? 【发布时间】:2012-03-01 08:07:28 【问题描述】:Grails 2.0 改变了它使用 grails.serverURL 开发和测试环境的方式(如manual 中所述)。但是,关于 Tomcat 上的生产部署,我有几个带有 serverURL 的 problems。 serverURL(生产模式)似乎有几个选项:
(已添加)此设置只是“烟雾和镜像”,因为 Tomcat 和 Jetty 具有控制如何为应用处理 URL 的方法,直至“应用”级别。
李>使用它来指定服务器(正如 Config.groovy 中的“TODO”所指出的那样)
不要像 Grails 贡献者之一所说的 here 那样使用它,即“删除 serverURL 属性并让 Grails 生成相对于当前正在运行的应用程序的 URL 应该始终是安全的。”目前尚不清楚这是否扩展到生产(当不生成电子邮件时)。
改用另一种方法,即 grails.app.context,Grails 2.0 手册中没有记录,但在某些参考文献here 和here 中有描述。您能否澄清一下对于 Jetty 和 Tomcat(生产模式)的 serverURL 和 app.context 的正确用法?
谢谢
【问题讨论】:
【参考方案1】:好问题!我只是在寻找正确的方法来获得实际的serverURL
,而无需在 Config.groovy(在 Grails 2.1 应用程序中)明确地对其进行配置。
从 Grails 2.0 开始,有一个名为 LinkGenerator
的超级有用的类,您几乎可以在任何地方使用它,例如在服务中:
import org.codehaus.groovy.grails.web.mapping.LinkGenerator
Class MyService
LinkGenerator grailsLinkGenerator
String serverUrl()
// Generate: http://localhost:8080/link-generator
grailsLinkGenerator.serverBaseURL
感谢 Haki 先生 blogging 关于此事!
【讨论】:
【参考方案2】:所以 grails.serverURL 配置参数的基本思想是让 createLink 方法在创建绝对链接时知道你想要什么 URL。如果没有指定 grails.serverURL 配置参数,它将默认为http://localhost:8080(除非指定了 server.port,否则 8080 将是任何值)...
应用程序上下文告诉 Jetty/Tomcat 在不同的根目录中运行应用程序。例如,指定
grails.app.context="/myApp"
会将您的应用程序根目录设置为“/myApp”。在生产模式下,应用程序上下文由 Web 容器处理,该指令被忽略。选择配置生产 jetty 或 tomcat 实例以在不同的上下文中运行您的应用程序完全取决于您的技术要求。
所以真正要考虑的是,在您的应用程序中,您是否在您的 GSP 中创建了许多绝对链接,您需要在其中定义“生产”服务器 URL?如果没有,那么您不需要指定它;如果你是,那么你需要指定它。
作为个人喜好,我在创建新的 grails 项目后总是做的第一件事是进入配置并将 grails.app.context 更改为“/” ...它使镜像生产环境更容易我。
希望这能解决问题!
【讨论】:
感谢您的详细回复。独立但相关,我在以简单的方式使用 UrlMapping 时遇到了很多麻烦,例如通过 URI 规范访问 html 页面。我创建了类似:“/test2”(uri:“/test2.html”)的东西,但是grails没有找到test2.html文件,即使它位于web-app或views目录的顶部。你知道如何使用这个映射吗? ...我现在有这个工作——URI。不知道为什么它以前从未工作过,但现在似乎找到了该文件。 这对于保持生产环境和开发环境之间的一致性非常有帮助。谢谢!以上是关于grails 2.0 - 正确使用 serverURL 进行生产?的主要内容,如果未能解决你的问题,请参考以下文章
用于 Grails 2.0 的 Grails/Gradle 插件
Spring Security UI 和 grails 2.0
如何使用 shiro 在 grails 2.0 中实现 BasicHttpAuthentication?有啥亮眼的例子吗?