这是外部重定向:
@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服务器中,但具有两个不同的jar / WEB-INF。 因此,requestDispatcher无法转发请求。
所以,问题是,如何让它工作,而不要求客户端发出两个http请求,而不在Web服务器中进行特殊配置。
另外,computeRelativeUrl(id)
有一些不容易提取的逻辑
(它绝对不是在Web服务器上编写简单代理配置的解决方案)
有什么想法吗?
一种可能的解决方案是我的webservice向relativeUrl发出http请求并将其返回给客户端(就像代理一样)。它应该返回内容以及所有http标头。
我怎样才能轻松实现这一目标?
答案 0 :(得分:0)
如果我理解您要实现的目标,您可以尝试进行“交叉上下文”调度。
ServletContext contextOfOtherWebapp = servletContext.getContext("/pathOfOtherWebapp");
查看ServletContext.getContext(String)
但它需要servlet容器才允许这样做。如果默认情况下不是,则可能是配置设置以启用它。