2013-04-10 92 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