Web应用程序如何转发到另一个Web应用程序?

时间:2013-10-17 09:56:46

标签: java redirect web-applications jetty war

我有两场静态战争,里面装满了由Jetty服务器提供的帮助文件和一个root上下文大战。

  • help.war - 英文帮助文件
  • help_CS.war - 捷克帮助文件
  • 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

    所以我的问题。应该如何/可以这样做?

1 个答案:

答案 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);
    }
  }