我有两场静态战争,里面装满了由Jetty服务器提供的帮助文件和一个root上下文大战。
ROOT.war
根据请求的区域设置,我想将用户转移到与他们相关的语言。即用户请求 /help/index.htm ,当他们从捷克语语言环境请求时,他们会得到 /help_CS/index.htm 。我们的想法是可以根据需要添加语言包,而不会有太多的麻烦。
I tried添加自定义RewriteHandler,在Jetty.xml中引用,它从Request获取区域设置,并在 handle()上转发或重定向 。两者都抱怨,因为响应代码已经被发送了......不知何故?!
我在ROOT.war的web.xml中尝试了自定义Filter,无论 url-pattern的变体是什么,我都无法匹配* / help / ** 我试过了。
然后我添加了对上次尝试进入 WEB-INF / web.xml 的同一个Filter的引用到我的help.war,这将匹配并且可以生成URLS但是我此时无法重写URL,因为它始终由 / help / 添加,因此帮助替换为help_CS的URL最终为 domain / help / help_CS / index.htm
所以我的问题。应该如何/可以这样做?
答案 0 :(得分:1)
原来如此!经过几天的讨论后,我发现something感觉有点hacky但是有效。
我使用自定义Filter,然后将 WEB_INF / web.xml 放入每个 help_XX.war ,并使用 servlet-mapping <每个war文件的/ em>(但在其他方面都相同)
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/help_CS</url-pattern>
</servlet-mapping>
然后在Filter内,我获得所需战争的ServletContext并使用该战争转发,从请求地址手动删除 / help
@Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) req;
String requestAddress = request.getRequestURI();
String country_code = req.getLocale().getCountry();
if (requestAddress.contains("/help/"))
{
ServletContext forwardContext = config.getServletContext().getContext("/help_" + country_code);
forwardContext.getRequestDispatcher(requestAddress.replace("/help", "")).forward(req, res);
}
else
{
chain.doFilter(req, res);
}
}