2013-04-10 95 views
0

这是一个外部重定向: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头文件。

我该如何轻松实现这一目标?

回答

0

如果我明白你想达到的目标,你可以尝试做一个“跨环境”调度。

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

检查ServletContext.getContext(String)

的文档但它确实需要servlet容器允许这样。如果它没有默认,它可能是一个配置设置来启用它。

+0

不幸的是,crossContext默认情况下http://tomcat.apache.org/tomcat-6.0-doc/config/context.html 禁用,我不能改变这个参数:( 一种可能性将是代理解决方案。任何想法? – 2013-04-10 14:01:39

+0

那么,我想你可以让你的“代理servlet”作为其他servlet的常规客户端,使用Apache HttpClient或类似的。 – NilsH 2013-04-10 14:34:45

+0

我也猜测这样:)但问题是是否有人已经完成它(也许它已经编写在javax.servlet中的某处),以一种方式返回代理请求的内容和所有http头。 – 2013-04-10 15:05:59