2012-02-08 48 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