2012-02-08 47 views
2

我知道這個問題已被問了好幾次,但是,我有一個不同的方法來實現我想要的。玩!框架 - SaaS子域名過濾器

Since Play 1.1, you're able to match hosts.這是非常有用的,但是,它意味着對於每個控制器,我需要通過subdomain路線PARAM。如果我有數百個使用subdomain參數的控制器,這是相當的負擔和重複。

是否沒有辦法創建一個過濾器,在執行其他所有操作之前查看主機名,然後爲該請求設置一個即時配置值?

例如(頭腦風暴),過濾器會執行以下操作:

// use request host, but hard-coded for now... 
    String host = "test.example.com"; 
    Pattern p = Pattern.compile("^([a-z0-9]+)\\.example\\.com$"); 
    Matcher m = p.matcher(host); 
    if (m.matches()) { 
     // OUT: test 
     System.out.println(m.group(1)); 
     System.setProperty("host", m.group(1)); 
    } 

而在車型我會做這樣的事情System.getProperty("host");

我知道這是不是那應該怎麼做,但我只是集思廣益。

至少用這種方式:

  1. 我沒有傳送到每個 控制器傳遞subdomain PARAM。
  2. 我沒有通過任何車型 無論是
  3. 車型已到subdomain值直接訪問通過subdomain PARAM這樣我就可以篩選出屬於客戶

物體。此外,我我知道System.setProperty()總是適用於整個JVM;這是一個問題。我只希望這個值在整個請求期間都可用。我應該使用什麼?

讓我們分析一下。你會怎麼做?什麼是一個好方法? Play可能嗎?我相信有相當多的人遇到這個問題。您的意見非常感謝。

回答

1

我覺得你很近。如果我必須這樣做,我會編寫一個註釋爲@Before的控制器,並使用該方法從請求標頭中提取主機名並將其放入renderArgs中。

像這樣的東西(我沒有測試過):

public class HostExtractor extends Controller { 

    @Before 
    public static void extractHost() { 
     // Code to read from request headers and extract whatever you need here. 
     String host = 'Your Code Here' 
     renderArgs.put("hostname", host); 
    } 
} 

然後,在你的其他控制器,你告訴它要使用該控制器上面的過濾器。

@With(HostExtractor.class) 
public class MyController extends Controller { 

    public static void homepage() { 
     String hostname = renderArgs.get("host", String.class); 
     // Do whatever logic you need to render the page here. 
    } 
} 

同樣,我沒有測試過這一點,但我在做類似的memcache緩存對象的東西。我希望這有助於!

+0

嗨@Todd - 謝謝你的回答。這是一個更好的方法。有沒有一種方法可以在模型中獲得配置屬性?如果沒有,那麼我會接受這個解決方案。 – Flukey 2012-02-09 09:11:54

+1

我剛剛閱讀這篇文章,也許我會走下這條路:http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-過濾器 – Flukey 2012-02-09 09:12:14