2009-06-10 83 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記錄,並且您有更多時間去做其他事情,比如爲應用程序添加新功能!