这是一个外部重定向:Web服务,内部代理,而不是外部重定向或内部重写
@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-INFs。 因此,requestDispatcher无法转发请求。
所以,问题是,如何让它工作,而不要求客户端发出两个http请求,并且不需要在web服务器中进行特殊配置。 也computeRelativeUrl(id)
有一些逻辑不能被容易地提取 (它是明确不写的Web服务器上的简单的代理配置的溶液)
任何想法?
一个可能的解决方案是,我的web服务向relativeUrl发出一个http请求,并将其返回给客户端(就像代理服务器一样)。它应该返回内容以及所有的http头文件。
我该如何轻松实现这一目标?
不幸的是,crossContext默认情况下http://tomcat.apache.org/tomcat-6.0-doc/config/context.html 禁用,我不能改变这个参数:( 一种可能性将是代理解决方案。任何想法? – 2013-04-10 14:01:39
那么,我想你可以让你的“代理servlet”作为其他servlet的常规客户端,使用Apache HttpClient或类似的。 – NilsH 2013-04-10 14:34:45
我也猜测这样:)但问题是是否有人已经完成它(也许它已经编写在javax.servlet中的某处),以一种方式返回代理请求的内容和所有http头。 – 2013-04-10 15:05:59