Java 如何创建一个类似“的域”;http://username.example.com" 在J2EE web应用程序中?

Java 如何创建一个类似“的域”;http://username.example.com" 在J2EE web应用程序中?,java,tomcat,jakarta-ee,Java,Tomcat,Jakarta Ee,我是一名web应用程序开发人员,只是一名初学者。 我正在设计一个小型的J2EE web应用程序(例如,服务名称如下)。它使用ApacheTomcat。 规范:当用户注册到web应用程序时,他将获得一个自定义域,如 如何在web应用程序中实现这一点。我还在开发这个应用程序。我还没有主持过 如果您在windows上,请编辑\windows\system32\drivers\etc\hosts文件并添加如下行: 127.0.0.1 username.mysite.com <VirtualH

我是一名web应用程序开发人员,只是一名初学者。 我正在设计一个小型的J2EE web应用程序(例如,服务名称如下)。它使用ApacheTomcat。 规范:当用户注册到web应用程序时,他将获得一个自定义域,如


如何在web应用程序中实现这一点。我还在开发这个应用程序。我还没有主持过

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

127.0.0.1  username.mysite.com
<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>
然后,当服务器运行时,您可以打开浏览器并键入:

http://username.mysite.com
http://username.mysite.com:8080
或者随便什么,看看网站

您需要管理员权限才能执行此操作

如果您在linux上,则需要编辑/etc/hosts,并执行相同的操作

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


然后,您必须在应用程序中编写一些代码来检查服务器变量,以找出使用了哪个子域,并基于此进行处理。

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


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

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


服务器管理员webmaster@subdomain1.example.com
DocumentRoot/www/subdomain1.example.com
ServerName subdomain1.example.com
ErrorLog logs/subdomain1.example.com host.example.com-error\u log
CustomLog logs/subdomain1.example.com-access_log common

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

  • 为“*.example.com”创建一个通配符虚拟主机,以便所有对子域的请求都转到该虚拟主机。
  • 为它设置一个重写规则,将所有请求重定向到一个页面,比如index.jsp
  • 编写一个JSP页面,获取用户访问的主机名,通过它将重定向URL搜索到存储中,即mysql db,然后重定向到它。此脚本将是通配符主机上的index.jsp脚本。

  • 如果使用这种方式,只需设置上述内容一次,然后将子域添加到存储中,这似乎比创建子文件夹和修改Apache配置更灵活。

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

    <VirtualHost *:80>
        ServerName example.com
        ServerAlias *.example.com
    </VirtualHost>
    
    
    ServerName example.com
    ServerAlias*.example.com
    
    然后使用类似于
    HttpServletRequest#getRequestURL()

    的方法处理应用程序代码中的子域

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


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

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

    首先,您需要Apache背后的Tomcat

    其次,您需要创建如下网站定义:

    127.0.0.1  username.mysite.com
    
    <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>
    
    这将创建一个Apache可以处理的通配符域。
    mod_rewrite
    规则将把URL重写为Tomcat能够理解的单个URL。然后,通过
    mod_proxy
    ,子域与名为
    proxy_domain
    GET
    参数一起被代理到基本域,以确定原始用户名


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

    我希望所有用户在应用程序运行时都能使用此功能。。这可能吗?我怎么做?用户进入他的域并通过该域登录到他的帐户…如果你能告诉我你是在windows还是linux上,我可以发布具体的说明。如果你两个类型,请告诉我们,因为我们渴望了解这两种场景:Apache httpd配置还是Apache Tomcat配置?所以我需要为我站点中的“每个用户”进行此配置?@lakshmanan:您最初将问题标记为“Apache”而不是“Tomcat”。“apache”一词是“apachehttpd服务器”的同义词,而不是“apachetomcat”。您从Sam、kinjal和Vincent那里得到的基于Apache HTTPD的答案不正确。这些不适用于Tomcat。但是,您可以在ApacheTomcat旁边安装ApacheHTTP服务器,并在Tomcat连接器(mod_jk)的帮助下将其作为代理提交给Tomcat。要获得真正的ApacheTomcat答案,请查看Thorbjorn和mjustin的答案。还可以如何完成这类工作?永远是