2011-03-02 70 views
3

這聽起來像一個微不足道的問題,但不知何故,我似乎無法弄清楚。如何在Spring MVC 2.5應用程序中更改HTTP OPTIONS請求的響應?

我有一個Spring MVC應用程序。除GET和POST外,我不支持任何http方法。我有我的所有控制器豆子下面的一組:

<property name="supportedMethods" value="GET,POST"/> 

然而,OPTIONS請求發送到我的應用程序發回,顯示所有 HTTP方法所允許的響應。

如何更改OPTIONS響應以僅顯示GET和POST方法?我知道我可以通過覆蓋doOptions方法在servlet中執行此操作,但我不確定Spring MVC應用程序。我是否需要擴展DispatcherServlet並覆蓋doOptions

該應用程序使用Spring mvc 2.5.6,基於SimpleFormController的控制器和基於xml的配置。

+0

我不做Spring,所以這裏只是一個帶鏈接的評論:http://forum.springsource.org/showthread.php?t=53472它顯示瞭如何控制這個的幾種方法。你也可能會覺得它很有用。 – BalusC

+0

感謝您的鏈接,BalusC。這裏描述的場景有點不同(控制器包裝的servlet和純控制器),但它證實了我的疑惑:默認情況下,OPTIONS請求不通過應用程序,並且由DispatcherServlet本身處理。所以現在我的問題變成了:如果OPTIONS確實通過了控制器(根據鏈接中建議的配置更改),我如何使它返回200(GET,POST)而不是405響應。鏈接中的海報必須擴展DispatcherServlet並覆蓋那裏的內容。這就是我認爲我必須要做的。 – samitgaur

回答

1

我想你可以調用WebContentGenerator#setSupportedMethods接收包含支持的方法的字符串數組作爲輸入參數。 WebContentGenerator是Spring 2.x控制器的基類,因此您只需在構建控制器時調用此方法,該控制器肯定會擴展它。您也可以使用WebContentGenerator的構造函數接收字符串可變參數(支持的方法)作爲輸入參數。

遺憾的是,FrameworkServlet類中的doOptions方法調用HttpServlet類的super.doOptions(request, response);。這種方法的輸出中基於在servlet中聲明的方法,這樣的事情:

​​

DispatcherServlet的類(和它的基類FrameworkServlet的)聲明所有這些方法:doPutdoDeletedoGetdoPost等。 ,所以doOptions的輸出不是你想要的。我認爲唯一的方法是繼承DispatcherServlet。

+0

這就是我通過xml配置設置名爲supportedMethods的屬性時已經在做的事情。我將支持的方法設置爲GET和POST。這使得控制器不支持其餘的方法(OPTIONS除外)。但是,這不會更改控制器的OPTIONS請求的輸出。它仍然發送一個響應,顯示所有啓用的方法。這就是我正在尋找解決方案。 – samitgaur

+0

好吧,現在我明白你的問題了,對不起。我更新了我的答案......但我認爲你應該繼承DispatcherServlet。 – javanna

+0

@Samit G.嗨,你有沒有看過我更新的答案?它有用嗎? – javanna

2

警告:我沒有處理OPTIONS消息。

在您的請求處理程序(使用@Controller註釋)中,可以使用RequestMethod.OPTIONS來處理選項請求。例如,你可以使用

... stuff ... 
    @RequestMapping(RequestMethod.OPTIONS) 
    public String processOptions() 
    { 
    ... stuff ... 
    }
+0

感謝您的回覆。然而,該應用程序使用Spring mvc 2.5.6,基於SimpleFormController的控制器和基於xml的配置。對不起,我沒有在這個問題中提到這一點。 – samitgaur

1

我知道這有點舊了,但我發現了這個問題的其他信息,我希望在未來能夠幫助其他人。

@RequestMapping(RequestMethod.OPTIONS)方法不能立即使用DispatcherServlet開箱即用,因爲它的超類FrameworkServlet首先委託給它的超類HttpServlet,如上所述,它掃描servlet以查看它是否它實現doXXX方法並相應地設置Allow頭。但是,隨着調用super.doOptions(...)然後,它有這些行:

if (this.dispatchOptionsRequest) { 
    processRequest(request, response); 
} 

而且有可以用來設置dispatchOptionsRequest值爲true的setDispatchOptionsRequest(布爾)。只有這樣,DispatcherServlet纔會將OPTIONS請求傳遞給控制器​​以適當註釋方法。

我需要這樣做才能允許OPTIONS請求根據當前用戶的授權返回不同的值。所以通過繼承DispatcherServlet並在默認構造函數中設置該參數,我終於能夠在控制器中接收http OPTIONS請求的調用並自行處理它。

還有一個想法,在那個控制器方法中,你可以聲明一個HttpServletResponse類型的參數,並且Spring會把實例交給你。一旦你可以調用reset()來清除已經設置好的Allow頭並根據需要展開自己的頭。 (注意:如果您計劃通過@RequestMapping(RequestMethod.TRACE)註釋您的控制器方法,通過setDispatchTraceRequest在FrameworkServlet中爲http TRACE支持提供了一個類似的模式。