如何在J2EE Web应用程序中创建类似“http://username.example.com”的域?

时间:2010-02-06 06:01:24

标签: java tomcat java-ee

我是一名网络应用程序开发人员,只是一名初学者。 我正在设计一个小型J2EE Web应用程序(例如,服务名称将类似于http://www.example.com)。它使用Apache Tomcat。 规范:当用户注册Web应用程序时,他将获得一个自定义域,如

http://username.example.com

如何在我的网络应用程序中完成此操作。我还在开发应用程序。我还没有托管它。

6 个答案:

答案 0 :(得分:4)

您需要为Apache配置中的每个子域创建一个虚拟主机,如:

< VirtualHost *:80>
ServerAdmin webmaster@subdomain1.example.com
DocumentRoot /www/subdomain1.example.com
ServerName subdomain1.example.com
ErrorLog logs / subdomain1.example.com-host.example.com-error_log
CustomLog logs / subdomain1.example.com-access_log common
< /虚拟主机>

但是有一个问题。如果您的解决方案需要创建文件夹,虚拟主机添加和apache重新启动,这对我来说不太好。我如何处理这个问题是:

  1. 为“* .example.com”创建通配符虚拟主机,以便对子域的所有请求都转到此虚拟主机。
  2. 为其设置重写规则,将所有请求重定向到一个页面,例如index.jsp
  3. 使用用户来的主机名编写一个JSP页面,通过它搜索重定向URL(即mysql db)并重定向到它。此脚本将是通配符主机上的index.jsp脚本。
  4. 如果您使用这种方式,您只需要设置上面一次,然后将子域添加到存储中,这似乎是比创建子文件夹和修改Apache配置更灵活的解决方案。

答案 1 :(得分:4)

你有两个问题。

首先,您需要让用户的浏览器识别“username.mysite.com”所在的位置。这需要DNS配置,通常采用“CNAME通配符”的形式。请注意,如果您想在试用阶段自己控制,dyndns.org会在其动态DNS专业版软件包中提供此功能。

第二个是您需要告诉Tomcat从主机名派生用户,并为每个用户提供一个特殊站点。最简单的方法是,最有可能的方法是在URL中的主机名上设置一个“品味”的servlet过滤器,并设置jsp页面所需的属性。

答案 2 :(得分:2)

如果您在Windows上,请编辑\ windows \ system32 \ drivers \ etc \ hosts文件并添加如下所示的行:

127.0.0.1  username.mysite.com

然后当服务器运行时,您可以打开浏览器并输入:

http://username.mysite.com
http://username.mysite.com:8080

或者其他什么,看看网站。

您将需要管理员权限。

如果您使用的是Linux,则需要编辑/ etc / hosts,并执行相同的操作。

但是,在部署时,更多的是配置Web服务器和DNS服务器。因此,如果您想获得完整的体验,则应在本地安装dns服务器并将其用作网络名称服务器。这是一个更复杂的任务,说明取决于您是在Linux还是Windows,以及您正在使用的Web服务器。

然后你必须在你的应用程序中编写一些代码来检查服务器变量,找出使用了哪个子域,并根据它进行处理。

答案 3 :(得分:2)

看起来您正在寻找Tomcat上的虚拟主机。然后需要在Tomcat中配置子域:

http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html

Web应用程序仅控制从上下文根开始的URL部分。因此,如果“www.mysite.com/”上有一个网络应用程序,它可以处理“www.mysite.com/alice”或“www.mysite.com/bob”的请求,但它不会处理“alice”的请求.mysite.com /“如果尚未在Tomcat服务器中配置。这意味着,对于每个新用户,都需要使用新的子域配置Tomcat。我认为这不能在Web应用程序中完成。

答案 4 :(得分:0)

您可以创建通配符虚拟主机

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
</VirtualHost>

然后使用HttpServletRequest#getRequestURL()

之类的内容处理应用程序代码中的子域

答案 5 :(得分:0)

我知道这是一个老问题,但我实际上想出了一个最近适用于 Tomcat 的答案:

首先,你需要在Apache背后使用Tomcat。

其次,您需要创建一个这样的网站定义:

<VirtualHost *:80>

    ProxyRequests On
    ProxyVia On
    <Proxy http://example.com>   #FIXDOMAIN
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(.+)\.example\.com$ [NC]   #FIXDOMAIN
    RewriteRule ^(.*)$ http://example.com$1?proxy_domain=%{HTTP_HOST} [P,QSA]    #FIXDOMAIN

    JkMount /* default

    ServerName example.com    #FIXDOMAIN
    ServerAlias *.example.com    #FIXDOMAIN

    <!-- Other normal options go here -->

</VirtualHost>

第三,您需要在Tomcat中将虚拟域设置为example.com

<Host name="example.com" appBase="webapps-example"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
    <Alias>www.example.com</Alias>
</Host>

这将创建Apache可以处理的通配符域。 mod_rewrite规则将重写URL到Tomcat理解的单个URL。然后,通过mod_proxy,子域域代理到基域,以及名为GET的{​​{1}}参数(在现有GET参数之上加上),以确定原始内容用户名是。

这是一个非常复杂的(可能不是非常可扩展的解决方案),因为Apache Tomcat支持支持通配符域。但它确实有效!