I know this question has been asked quite a few times, however, I have a different approach of what I want to achieve.
Since Play 1.1, you’re able to match hosts. This is very useful, however, it means that for every controller, I will need to pass through the subdomain route param. This is quite a burden and repeatful if I have hundreds of controllers which use the subdomain param.
Is there not a way to create a filter which looks at the host name before everything else is executed and then sets an on-the-fly config value for that request?
For example (brainstorming), a filter would do the following:
// 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));
}
And in the models I’d do something like System.getProperty("host");
I know this isn’t how it should be done, but I’m just brainstorming.
At least with this way:
- I don’t have to pass the
subdomainparam through to every
controller. - I don’t have to pass the
subdomainparam through to any models
either - Models have direct access to the
subdomainvalue so I can filter out objects that belong to the client
Also, I’m aware that System.setProperty() always applies to the entire JVM; which is a problem. I only want this value to be available throughout the duration of the request. What should I use?
Let’s analyse. How would you do it? What would be a good approach? Is this possible with Play? I’m sure there are quite a few running into this problem. Your input is highly appreciated.
I think you are close. If I had to do this, I would write a controller annotated with
@Beforeand have that method extract the hostname from the request headers and put it in renderArgs.Something like this (I haven’t tested it):
Then, in your other controllers, you tell it you want to use that controller above as a filter.
Again, I haven’t tested this, but I’m doing something similar to cache objects in memcache. I hope that helps!