这是一个外部重定向:
@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 标头。
我怎样才能轻松实现这一目标?