需要一般视图模式区分的想法

时间:2011-05-16 12:31:56

标签: playframework

我正在创建一个具有2种视图模式的Web应用程序。一种模式只是普通的网站。其他视图模式将作为Facebook应用程序。在Facebook中,应用程序显示在iframe中。在我的应用程序中,我必须能够检测视图是处于Facebook模式还是独立模式。我需要检测这个,因为在Facebook中屏幕较小(760px)所以我需要选择不同的CSS文件,但我也可能会更改某些链接目标,一般布局或某些控制器行为。我想在一台服务器上部署整个应用程序。我不想提前对应用程序进行分区。我知道如何在不同节点上物理地分离两个视图,即,如果此服务器处于facebook模式,则应用不同的application.conf文件,其中包含静态参数。物理分离意味着要测试2种不同的配置,有2种不同的部署,我想避免这种情况。所以我正在寻找更“合理”的分离。

我有以下想法:

1。)为每个请求添加一个参数“GET /...?facebook=1”并在@Before方法中提取

这里的缺点是我必须手动将参数添加到所有后续链接=>厌倦和容易出错

还是有办法在生成反向路由时“破解”路由器吗?

2。)在路径前加上一些上下文“GET / fb / ...”并检查它是否存在于@Before动作中

这里的缺点是我需要复制路线并且显示停止似乎反向路由是模糊的,我没有看到告诉路由器我想要哪条路线的方法

再次,是一种攻击路由器以在反向路由上添加前缀的方法吗?

3。)<您的建议,请;)>

...

由于

2 个答案:

答案 0 :(得分:1)

我找到了一个简单的解决方案:我将在Apache负载均衡器的/ etc / hosts中为目标计算机的主机名设置别名,然后将所有对facebook子域的请求路由到与正常情况下相同的集群主机查看,但使用别名。

然后在我的播放控制器中,我使用@Before操作检查request.domain是否存在“facebooked”名称别名:

public class MyController extends Controller {

    static ThreadLocal<Boolean> facebook = new ThreadLocal<Boolean>();

    @Before
    static void globals() {
        facebook.set(request.domain.endsWith("-fb"));
        renderArgs.put("facebook", facebook.get());
    }

    protected static boolean isFacebook() {
        return facebook.get();
    }
}

现在,2个不同的负载均衡器可以访问单个播放群集。我已经建立了它,到目前为止它的效果非常好。

答案 1 :(得分:0)

这可能不是最佳选择,但您可以创建一个主页面,该主页面接收一个参数,显示它们是否来自Facebook,并在用户的会话中存储一些标志。然后根据该参数创建要修改的所有css / js / links / etc的路径。类似的东西:

/公共/静态/ $ {PARAM} /file.ext

其中$ {param}可以是FB或NFB,它将决定路径。