运行 Grails 和 Sencha ExtJS 合而为一 Tomcat

Running Grails and Sencha ExtJS in one Tomcat

有一个 运行 的应用程序,其前端是用 ExtJS 制作的,而后端是使用 Grails 构建的。

ExtJS 应用程序是从 Windows 命令行构建和部署的,使用 sencha app build 然后 sencha web start 在端口 80 上启动应用程序。一切都很好。接下来,Grails 应用程序是 运行 通过 IntelliJ (Run->Run 'Application') 但 运行s 在端口 8080 中。

如何从 ExtJS 应用程序调用 Grails 中的服务,因为它依赖于同一端口?有没有办法通过虚拟主机在一个 Tomcat 实例下部署应用程序?

如果您的后端不是 node.js,则 Sencha Web Start 命令无用。

对于网络服务器,ExtJS 只不过是静态文件,因为它是由浏览器提供和解释的。我不知道具体 tomcat/grails,但每个 Web 服务器都应该能够以某种方式提供静态文件。

例如,我使用 ASP.NET 后端,并且我将 ExtJS 文件添加到 ASP.NET 项目工作目录中。所以当我想调试时,我从 VisualStudio 在本地启动后端调试进程,我可以加载静态 javascript 文件,然后可以访问后端进程。我从来没有用过 Sencha Web Start,因为正如我所说,如果你有一个不是 node.js 的后端,它就没用了。

您必须为 tomcat/grails 执行相同的操作。如何实现这是一个纯粹的 tomcat/grails 问题,与 ExtJS 无关。

您可以通过在服务器端和客户端启用 CORS 让您的 ExtJS 调用其他端口。

Grails

要在 grails 端启用 CORS,您可以安装此 plugin 并将以下配置添加到您的 Config.groovy。基本上我们告诉任何域都可以向这个应用程序发出请求。

cors {
    enabled = true
    url.pattern = '*'
    allow.origin.regex = '.*'
    headers=[
        'Access-Control-Allow-Headers': 'origin, authorization, accept, cookie, set-cookie, content-type, x-requested-with',
        'Access-Control-Allow-Methods': 'GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS',
        'Access-Control-Max-Age': 3600
    ]
}

ExtJS

我们还需要在 ExtJS 端启用 CORS,为此我们可以简单地为所有 AJAX 请求添加一个 beforerequest 侦听器。此外,我更喜欢有一个可以配置我的 API Url 的公共位置,因此与其在代理等所有地方定义 API URL,不如 ajax请求我们可以集中处理。

您可以通过在应用程序启动方法中添加以下代码来实现。

var API_URL = 'http://localhost:8080/grailsappp'
Ext.Ajax.on({
     beforerequest: function(conn, opts){        
        if(opts.url) {
            opts.url = API_URL + opts.url;
        }
        conn.setCors(true);
    }
});