這是一個外部重定向: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