2009-06-10 48 views
9

我有一个web应用程序,用户可以在其中创建他们的帐户并使用该服务。现在我想给他们一个自定义域设施,其中 app.customer1web.com points_to myservice.com与userid customer1 一旦他建立自定义域,对于世界看起来像我的服务正在他的机器上运行。 许多服务,如博客,wp.com,tumblr给 这个功能。如何给saas软件提供cname向前支持

我该怎么做? 我正在使用java编写我的web应用程序。 如何在请求进入时将域名映射到用户ID?

回答

11

如何在请求进入时将域名映射到用户ID?

显然,您必须在某处存储该信息,很可能存储在数据库中。

  1. 添加数据库表domains与列:

    • 客户ID
    • 活动状态(1或NULL)
    • 挑战

    添加唯一的密钥(名称,活动)以确保域名被映射一次。

  2. 当客户尝试添加一个域时,添加一个active = NULL并挑战设置为随机字符串的行。

    向客户显示随机字符串,并要求他们在网站上放置一个网页或创建一个虚拟DNS记录来验证域名所有权(这是Google Apps的做法)。

    您可以通过向管理联系人发送电子邮件或以其他方式验证所有权。

  3. 当客户说他按照您的指示在第2步中做了什么时,请验证它并设置active = 1,challenge = NULL。

    如果该域先前对某个其他客户有效,请删除这些记录或将active设置为0。

  4. 要求客户为其域添加CNAME记录并将其转发到您的域,例如, hosted.myservice.com(Google使用Google Apps的ghs.google.com)。

  5. 当一个请求进来,做

    SELECT customerId FROM domains WHERE name=:requestDomain AND active=1 
    

一个更好的办法可能是自动提供你的客户在<customername>.myservice.com除了格式的域名自定义域。这给你两个好处:

  • 不愿意使用自己的域的客户仍然可以自定义他们的登录页面,例如,与一个公司商标。

  • 对于自定义域,您可以要求客户将它们转发到<customername>.myservice.com而不是通用的hosted.myservice.com

    这使您能够在多台服务器之间水平分配客户,而无需要求客户在其端点上更改任何内容。例如,您可以让客户选择是否希望他们的帐户托管在欧盟或美国。当他们改变它时,只需传输他们的数据并更新<customername>.myservice.com。他们的自定义域将自动工作。

要做到这一点,你必须建立一个通配符DNS记录*.myservice.com(除非您还需要后者的功能,在这种情况下,你必须要管理个人记录)。

+0

我认为这是一个很好的答案。我学到了东西,谢谢Jaka! – Upgradingdave 2009-12-16 21:10:12

0

我不太清楚,如果我真的明白你想做什么,但我试图给你一个可能的解决方案(至少对于你的问题的Java部分)。

一种可能性是以每个请求由单个Servlet(web.xml)处理的方式设置应用程序服务器。这个servlet可以找出请求的URL(HttpServletRequest.getRequestURI)并提取用户名。然后你知道用户,并可以将这些信息用于任何你想做的事情。

请注意,有很多DNS的东西涉及到你想做的事情! (至少车费,我理解这一点。)你可以使用

1

一种解决方案是建立为您的应用WildCard DNS Record,并让应用程序本身检查RequestURI看到用户对未来在什么主机名。

我知道这是一个非常模糊的答案,但它听起来像设置了WildCard记录,使用单个函数检查主机名是最佳选择。这样,每次客户注册时都不必设置DNS记录,并且您有更多时间去做其他事情,比如为应用程序添加新功能!