我对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。我使用这个例子是因为它很容易解释。
发布于 2011-07-06 23:15:10
您的解决方案不是为您提供了由同一代码库支持的多个webapp实例吗?如果是的话,我不认为你应该做什么。
我不知道是否有开箱即用的解决方案可以在单个what应用中做到这一点,但如果没有,我会这么做。
第一件事是,为了让它无缝工作,您需要单独的应用程序实例。
如何做到这一点?
扩展WicketFilter类(这是将servlet容器链接到Wicket的servlet过滤器)。该类有一个名为webApplication的字段,您必须将其替换为vhostname-application映射。(这也意味着复制doFilter()方法的全部代码,因此它不是一个非常整洁的解决方案。这更像是一个黑客行为。无论如何)
这样就可以了,每个vhost都有一个单独的应用程序实例。
但您的会话变量仍将在站点之间共享,这不是一个好主意。(在实践中,您的浏览器不会将一个vhost发出的cookie发送到另一个vhost,但是如果将会话id放在url中,您可以通过这种方式跨越vhost。)
为了避免会话混淆,您还必须更改getFilterConfig()方法,以便它为不同的应用程序实例返回不同的配置。(筛选器名称是用于为会话变量添加前缀的属性。)
我不是100%确定这是否有效,我还没有尝试过,但如果你不能找到一个更好的(更重要的是,更干净的)解决方案,这是你唯一的选择。
发布于 2011-07-07 01:52:39
在Wicket 1.5中,这一要求非常简单。您只需要设置自定义根请求映射器,它将在所有预定义(系统)请求映射器之前接收请求。这样,您可以检查请求url并返回相应的页面,或者如果该url与您的任何映射都不匹配,则让默认映射器处理该url。
请参见Application#setRootRequestMapper()和IRequestMapper接口。HttpsMapper和CryptoMapper是这样工作的。
另一种方法是#mount(IRequestMapper),并使用非常高的IRequestMapper#getCompatibilityScore)。Wicket使用此分数来决定将哪个映射器与缺省根映射器一起使用。
https://stackoverflow.com/questions/6598155
复制相似问题