在端口80上链接apache web服务器,在端口8080上链接tomcat webapp

时间:2012-10-22 23:05:58

标签: gwt tomcat

在端口80上我有正常的apache web服务器。

在端口8080上,我有tomcat与客户端和服务器端的东西。

我的目标是:

www.mydomain.com渲染一个静态和SEO友好的index.html,而javascript的东西正在加载。

在这个index.html的标题中,我加载www.mydomain.com:8080/myapp/stuff.js

stuff.js使用gwt编译并调用RootLayoutPanel.get()。add(nice_panel),它将删除静态内容并显示动态小部件。它还调用servlet(服务器端代码)。

问题:出于安全原因,浏览器不会让我加载www.mydomain.com:8080/myapp/stuff.js,因为它位于不同的端口上。

错误尝试:我尝试从“普通”apache web服务器目录创建一个符号链接到包含stuff.js的tomcat webapp。我现在能够加载stuff.js,因为它的URL是:www.mydomain.com/mysymlink_to_tomcat/stuff.js。但是由于浏览器安全规则(“XMLHttpRequest无法加载......来源...... Access-Control-Allow-Origin不允许”),stuff.js再也无法再次在服务器端调用servlet。)

我想避免使用header('location:http://mydomain.com:8080/another_index_on_tomcat.html')从index.html重定向到tomcat的“疯狂”解决方案。这个解决方案有效,但它有许多缺点(SEO ...)

最好的方法是什么?

感谢。

3 个答案:

答案 0 :(得分:3)

你基本上有两个解决方案:

  • 使其适用于2个来源:使用GWT中的xsiframe链接器允许:80上的页面从:8080加载脚本(对于读者:它不是关于加载,它是关于脚本的作用)。 将以下内容添加到`gwt.xml:

    <add-linker name='xsiframe' />
    

    遗憾的是,这不会解决您使用GWT-RPC的问题(无论您使用什么来与服务器通信)。为此,有CORS

  • 使用单一来源:使用Apache的mod_proxy(或mod_jk)通过Apache代理您的Tomcat。没有人会使用:8080,一切都将通过:80。请参阅https://developers.google.com/web-toolkit/doc/latest/DevGuideServerCommunication#DevGuideRPCDeployment使用Tomcat和Apache HTTPD以及代理

当然还有放弃HTTPD并使用Tomcat服务所有内容的解决方案(最近的Java和Tomcat版本已经修复了它们的缓慢问题)。

答案 1 :(得分:1)

我不确定这是否可以避免安全错误,但您可以尝试使用iframe。在apache上,你有一个索引和一个iframe到tomcat,其中JS在iframe中加载。 Dunno,如果这将有助于SEO问题。

答案 2 :(得分:1)

最好的解决方案是在客户端调用请求tomcat应用程序时,将端口80调用重定向到apache上8080。

在apache上安装mod_jk并将其配置为在所需路径上安装上下文 例如:(编辑/mods_enabled/jk.conf)

# Configure access to jk-status and jk-manager
# If you want to make this available in a virtual host,
# either move this block into the virtual host
# or copy it logically there by including "JkMountCopy On"
# in the virtual host.
# Add an appropriate authentication method here!
<Location /jk-status>
    # Inside Location we can omit the URL in JkMount
    JkMount jk-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>
<Location /jk-manager>
    # Inside Location we can omit the URL in JkMount
    JkMount jk-manager
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

JkMount /*/myAppDir/* ajp13

然后在您的站点设置中添加虚拟主机(编辑/ apache2 / sites-enabled /)

    <VirtualHost *:80>
    . Here is the rest of the
    . of the config of
    . the host
    # Tomcat jk connector settings
    JkMount /*.jsp ajp13_worker
    JkMount /myAppDir/* ajp13_worker
    JkMount /myAppDir* ajp13_worker
    JKMount /manager* ajp13_worker
    JkMount /manager/* ajp13_worker
    </VirtualHost>

您还应编辑server.xml文件并在标记内写入并注释以前的​​主机名=“localhost”

<!-- Define an AJP 1.3 Connector on port 8009 -->

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost" appBase="webapps" unpackWARs="true"
   autoDeploy="true" >

          <Context path="/" docBase="/var/lib/tomcat7/webapps/myAppDir/"
                       debug="0" reloadable="true" />
          <!-- please notes on logs down below -->
     <Valve className="org.apache.catalina.valves.AccessLogValve"
             directory="/var/lib/tomcat7/logs" prefix="tomcat_access_" 
            suffix=".log" pattern="common" resolveHosts="false" />
  </Host>

剩下要做的就是编辑workers.properties文件并添加

worker.myapp2.port=8009
worker.myapp2.host=localhost
worker.myapp2.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13_worker

然后你应该设置工作,当出现包含myAppDir的url时,apache服务器会将调用重定向到tomcat,答案将从apache返回。