我对Wicket有一个不寻常的要求。我之所以选择Wicket,是因为我将以网站设计为中心,它的URL安装功能对SEO来说是最好的。不幸的是,我发现了一个凹凸。
我想为不同的主机创建一个具有不同设计的网站。这个站点将有一些主机别名(比方说:“abc.com”,“abc.com.br”,“abc.com.pl”) - 都指向相同的代码库(即同一个tomcat主机实例)。由于Tomcat和自定义ResourceStreamLocator,该部分已经启动并运行。
现在,我希望为不同的主机安装不同的安装程序。这意味着“abc.com/page1”,“abc.com.br/pagina1”和“abc.com.pl/strona1”必须指向相同的“Page1.class”页面。来自“abc.com”的用户无法看到“abc.com/pagina1”或“abc.com/strona1”。
我该怎么做“基于动态主机的挂载”?
请注意我不是在谈论i18n。我正在使用这个例子,因为它很容易解释。
答案 0 :(得分:2)
您的解决方案不是为您提供了由相同代码库支持的多个webapp实例吗?如果是的话,我认为你不应该做任何事情。
我不知道是否有一个开箱即用的解决方案可以在单个webapp中执行此操作,但如果没有,这就是我要做的。
首先,要实现无缝工作,您需要单独的应用程序实例。
如何实现这一目标?
扩展WicketFilter
类(这是将servlet容器链接到Wicket的servlet过滤器)。该类有一个名为webApplication
的字段,您必须用vhostname-application映射替换它。 (这也意味着复制doFilter()
方法的整个代码,因此它不是一个非常简洁的解决方案。它更像是一个黑客。无论如何)
这应该可以解决问题,每个vhost都有一个单独的应用程序实例。
但是你的会话变量仍将在站点之间共享,这是一个坏主意。 (实际上,您的浏览器不会将一个vhost发出的cookie发送到另一个vhost,但如果会话ID放在url中,则可以通过这种方式跨越vhost。)
为避免会话混淆,您还必须更改getFilterConfig()
方法,以便它向不同的应用程序实例返回不同的配置。 (过滤器名称是用于会话变量前缀的属性。)
我不是100%确定这会起作用,我没有尝试过,但如果你找不到更好(更重要的是,更清洁)的解决方案,这是你唯一的选择。
答案 1 :(得分:2)
在Wicket 1.5中,这个要求非常简单。 您只需要设置自定义根请求映射器,它将在所有预定义(系统)请求映射器之前接收请求。这样,您可以检查请求URL并返回相应的页面,或者让默认的映射器处理该URL,如果它与您的任何映射都不匹配。
请参阅Application#setRootRequestMapper()和IRequestMapper接口。 HttpsMapper和CryptoMapper以这种方式工作。
另一种方法是使用非常高的IRequestMapper#getCompatibilityScore来#mount(IRequestMapper)。 Wicket使用此分数来决定使用默认根映射器的映射器。