如何让两个域名指向同一个网络应用程序并显示不同的内容?

时间:2012-08-27 14:48:55

标签: java web-applications amazon-web-services

我有两个客户,每个都是一个设计相近的餐厅网站。

有主页面,菜单页面,联系我们页面等。

我想在Java中构建它,可能在我自己的Amazon AWS虚拟机上运行Tomcat或GlassFish。

我的问题是,如果我有一个网络应用程序:

1.2.3.4/myapp

,其中

1.2.3.4/myapp?clientid=1

显示了A餐厅的网站,

1.2.3.4/myapp?clientid=2

显示了Restaurant B的网站

如何进行设置:

www.restaurantA.com显示1.2.3.4/myapp?clientid=1

的内容

www.restaurantB.com显示1.2.3.4/myapp?clientid=2

的内容

非常感谢任何建议或想法!

2 个答案:

答案 0 :(得分:1)

以下是我目前部署的Tomcat解决方案。您可以将?clientid=1文件配置为根据源?clientid=2地址将请求传递到特定的Web应用,而不是使用server.xmlIP。在server.xml

<Host name="www.restaurantA.com"  
    appBase="restaurantA"
    unpackWARs="true" 
    autoDeploy="true">
</Host>
<Host name="www.restaurantB.com"  
    appBase="restaurantB"
    unpackWARs="true" 
    autoDeploy="true">
</Host>

然后在$TOMCAT_HOME/中,与webapps一起创建两个名为restaurantArestaurantB的文件夹。将您的webapps ROOT.war部署到正确的文件夹中,然后重新启动Tomcat。在我看来,这个解决方案更加清晰,它完全将Web应用程序彼此分开。

答案 1 :(得分:1)

如果您只希望一个网络应用根据原始网址提供不同的内容,则可以简单地使用javax.servlet.Filter。首先在web.xml

中声明过滤器
<filter>
  <filter-name>DomainNameFilter</filter-name>
  <filter-class>com.whatever.blah.DomainNameFilter</filter-class>
</filter>   

 <filter-mapping>
  <filter-name>DomainNameFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后创建一个名为DomainNameFilter的类,它实现javax.servlet.Filter。在doFilter()方法中,您可以像这样获取原始网址:

request.getServerName()

如果您使用任何其他过滤器,请务必致电chain.doFilter(request, response);。既然您知道了原始域名,那么您可以构建适当的响应。我通过在doFilter()方法中设置特定于域的属性来完成此操作:

request.setAttribute("title", titleMap.get(request.getServerName()));

其中titleMap是从HashMap的{​​{1}}方法中的数据库加载的Filter。例如,要在JSP中使用该值,您可以像这样访问它:

init()

如果您想查看有效示例,请查看http://thermodynamiccomputing.org/http://fnode.xeiam.com/。这两个论文网站实际上都是使用我刚才描述的过滤技术的完全相同的webapp。