Web服务,内部代理而不是外部重定向或内部重写

时间:2013-04-10 11:29:36

标签: java web-services spring

这是外部重定向:

@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标头。

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

1 个答案:

答案 0 :(得分:0)

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

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

查看ServletContext.getContext(String)

的文档

但它需要servlet容器才允许这样做。如果默认情况下不是,则可能是配置设置以启用它。

相关问题