基于Wicket的动态主机装载

基于Wicket的动态主机装载,wicket,Wicket,我对小门有一个不寻常的要求。我选择Wicket是因为我将以我的网站设计为中心,它的URL挂载功能对于SEO来说是最好的。不幸的是,我发现了一个肿块 我想为不同的主机创建一个具有不同设计的站点。该站点将有一些主机别名(比如:“abc.com”、“abc.com.br”、“abc.com.pl”)——所有这些别名都指向相同的代码库(即相同的tomcat主机实例)。由于Tomcat和定制的ResourceStreamLocator,该部分已经启动并运行 现在,我想为不同的主机安装不同的挂载。这意味着“

我对小门有一个不寻常的要求。我选择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。我之所以使用这个示例,是因为它很容易解释。

不过,您的解决方案不是提供了由同一代码库支持的多个webapp实例吗?如果是的话,我认为你不应该做什么

我不知道是否有现成的解决方案可以在单个webapp中实现这一点,但如果没有,我会这么做

第一件事是,要使其无缝工作,您需要单独的应用程序实例

如何做到这一点

扩展
WicketFilter
类(这是将servlet容器链接到Wicket的servlet过滤器)。此类有一个名为
webApplication
的字段,您必须用vhostname应用程序映射替换该字段。(这也意味着复制
doFilter()
方法的整个代码,因此这不是一个很好的解决方案。无论如何,这更像是一种黑客行为。)

这应该可以做到,每个vhost将有一个单独的应用程序实例

但是您的会话变量仍将在站点之间共享,这是一个坏主意。(实际上,您的浏览器不会将一个vhost发布的cookie发送给另一个vhost,但如果会话id放在url中,您可以通过这种方式跨vhost。)

为了避免会话混淆,您还必须更改
getFilterConfig()
方法,以便它向不同的应用程序实例返回不同的配置。(筛选器名称是用于会话变量前缀的属性。)


我不是100%确定这会起作用,我还没有尝试过,但如果你找不到更好(更重要的是,更干净)的解决方案,这是你唯一的选择。

这一要求在Wicket 1.5中非常简单。 您只需要设置自定义根请求映射器,它将在所有预定义(系统)请求映射器之前接收请求。通过这种方式,您可以检查请求url并返回相应的页面,或者如果url与您的任何映射不匹配,则让默认映射程序处理url

请参阅应用程序#setRootRequestMapper()和IRequestMapper接口。HttpsMapper和CryptoMapper就是这样工作的


另一种方法是#使用非常高的IRequestMapper#getCompatibilityScore#挂载(IRequestMapper)。Wicket使用该分数来决定使用默认根映射器的映射器。

非常感谢您提供的详细答案。我使用一个webapp来简化部署。令人遗憾的是,我看到WicketFilter并不是为扩展而精心设计的——“webApplication”是私有的,在没有getter的情况下使用。要使用您的解决方案,我必须重新实现所有过滤器…:(但是你给了我一些新的想法来探索!再次感谢!太棒了!我做到了!我没有扩展WicketFilter,而是用vhost映射实现了Filter,正如你所说的那样隔离了应用程序实例。这也解决了会话问题,因为我可以在初始化WicketFilter时传递一个新的FilterConfig。很好,我应该考虑链接filt呃。@Iredick这是我第一次(也是成功的)尝试:这真的很好。肯定比我的想法好多了。:)谢谢你的回答。我不认为它解决了biziclop所指出的会话问题,但我将给出+1,因为它似乎很容易使用。我没有阅读他的完整答案。。。请参阅我的答复。使用这种方法,您将有几个.war重用相同的.jar。jar将包含公共组件、行为。。。.wars将有其特定的应用程序类,这些类可能从您的BaseApplication类扩展而来,它们将只执行装载。这是一个很好的解决方案,但我的问题不同。类似于“css禅园”,HTML和URL的挂载也会发生变化。不过还是要谢谢你!我知道总有一天我需要使用它!:)