2013-07-27 32 views
0

我花了幾天時間研究這個問題,但還沒有找到適合我的情況的合適答案。我有一個Spring 3.1 MVC應用程序。目前,一些供應商通過Web客戶端登錄應用程序,在這種情況下,用戶信息存儲在會話中。我想通過RESTFul Web服務向其他供應商公開一些服務,但要讓供應商將供應商ID作爲URI的一部分或通過PARAMS傳遞。有沒有辦法在單個地方處理供應商ID,然後轉發給相應的控制器進行請求處理?供應商ID是否應該是URI的一部分,或者供應商ID是否應該在請求正文中傳遞?我已經看過攔截器,但是我怎樣才能做到這一點與多個URI或RESTFul web服務的每個控制器?任何建議將不勝感激Spring MVC處理不同URI的公共地方的相同請求參數

+0

你是什麼意思在一個地方處理請求?你能舉一個你的意思嗎? – Bart

+0

我的意思是通過攔截器,過濾器等通用的方式,我不想在所有的控制器中的代碼。我想通過供應商ID作爲URI模板的一部分,但正在尋找一種方法將供應商ID參數轉換爲具有更多有用信息的供應商對象。 Solubis建議在標題中傳遞id可能不錯,但Web服務可能會通過代理,在這種情況下,標題可能會被重寫,從而失去自定義標題信息。歡迎其他建議 – user2626064

回答

1

有一個自定義標題是最乾淨的選項,但參數也同樣適用。 在攔截器10 preHandle方法中,您可以通過標頭或參數查找供應商,並通過將對象添加到其屬性來將其附加到請求。

request.addAttribute("vendor", myVendorInstance); 

從上vendor該點可以從像請求中檢索:

Vendor vendor = (Vendor) request.getAttribute("vendor"); 

攔截器可以被映射到任何URL你喜歡使用映射例如

<mvc:interceptor> 
    <mvc:mapping path="/vendors/**" /> 
    <bean class="my.package.VendorLookupInterceptor" /> 
</mvc:interceptor> 

使提供給控制器的供應商對象的另一種方法是注入它。例如,假設對這個對象感興趣的控制器應該實現這個接口。

public interface VendorAware { 
    public void setVendor(Vendor vendor); 
} 

實現此接口的控制器可以由攔截器處理並獲得供應商注入。

if (handler instanceof HandlerMethod) { 
    Object bean = ((HandlerMethod) handler).getBean(); 

    if (bean instanceof VendorAware) { 
     Vendor vendor = getVendor(); 
     ((VendorAware) bean).setVendor(vendor); 
    } 
} 
+0

因此攔截器會在請求到達控制器之前攔截請求? – acdcjunior

+0

如果使用preHandle方法。是。 – Bart

+0

哦,真好!謝謝!+1 – acdcjunior

0

很明顯,將供應商ID添加到URI的問題是,它影響所有的URL,所以不能輕易使控制器通用。 另一種方法是將供應商ID作爲標題傳遞給控制器​​。您可以使用X-User標頭。

然後,你可以寫一些類型的處理程序來檢查這個頭,可能性:

  • 春天攔截
  • Servlet過濾器
  • 春季安全
  • AspectJ的
相關問題