0

这是一个外部重定向:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public void getFile(@PathVariable final long id, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {
    final String relativeUrl = computeRelativeUrl(id); 
    System.out.println("DEBUG. relativeUrl: " + relativeUrl);

    response.sendRedirect(relativeUrl);
}

问题在于客户端需要发出两个 http 请求来获取文件。

这是内部重写:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public void getFile(@PathVariable final long id, final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {
    final String relativeUrl = computeRelativeUrl(id);
    System.out.println("DEBUG. relativeUrl: " + relativeUrl);

    ServletContext context = RequestContextUtils.getWebApplicationContext(request).getServletContext();
    RequestDispatcher rd = context.getRequestDispatcher(relativeUrl);
    rd.forward(request, response);
}

问题在于响应计算的 relativeUrl 的 servlet 不在同一个 servletContext 中。也就是说,该 servlet 部署在同一个 Web 服务器中,但具有两个不同的 jars/WEB-INF。因此,requestDispatcher 无法转发请求。

所以,问题是,我怎样才能让它工作,而不要求客户端发出两个 http 请求,也不需要在 webserver 中进行特殊配置。此外,computeRelativeUrl(id)还有一些无法轻易提取的逻辑(这绝对不是在 Web 服务器上编写简单代理配置的解决方案)

任何想法?

一种可能的解决方案是我的 web 服务向 relativeUrl 发出 http 请求并将其返回给客户端(就像代理一样)。它应该返回内容以及所有 http 标头。

我怎样才能轻松实现这一目标?

4

1 回答 1

0

如果我了解您要实现的目标,您可以尝试进行“跨上下文”调度。

ServletContext contextOfOtherWebapp = servletContext.getContext("/pathOfOtherWebapp");

检查文档ServletContext.getContext(String)

然而,它确实需要 servlet 容器来允许这样做。如果默认情况下没有,则可能是启用它的配置设置。

于 2013-04-10T11:38:03.897 回答