2009-12-28 82 views
0

我想解決的問題是,我想檢查所有傳入的GET網址對數據庫。如果網址存在於數據庫中,它將被傳遞給certein控制器。我使用的是Spring 3.0。在任何HandlerMapping之前修改HttpServletRequest?

首先,我嘗試製作一個interceptor並將其添加到DefaultAnnotationsHandlerMapping。原來,我無法修改preHandle()中的URL。該計劃是修改請求中的url,然後讓註釋的控制器處理剩下的部分。

接下來我試着做一個自定義的HandleMapping。我擴展了AbstractUrlHandlerMapping並創建了我自己的getHandlerInternal(),它返回一個帶有控制器名稱的String,並且這個工作正常。但我更喜歡一個解決方案,我可以修改請求中的url並讓註釋的控制器處理它。

在寫這篇文章的時候,我開始想到可能servlet過濾器是最合適的解決方案。如果是這種情況,我可以讓Spring將EntityManager注入到過濾器中嗎?我可以擴展的任何Spring類,使這更容易嗎?

解決第一段中問題的最正確方法是什麼?如果是servlet過濾器,請給我一些關於如何寫它的指示。

回答

0

正如其他人已經指出的那樣,一個標準的servlet過濾器可以完成這項工作,但它不是一個非常適合Spring的解決方案 - 過濾器不是由Spring管理的,因此不能與Spring bean連接。過濾器需要以編程方式獲取spring beans,這並不好。

修改現有請求的URL時遇到的問題是它相當違反了servlet API模型。 HttpServletRequest有多個路徑和URL相關的方法,可以提取原始URL的不同部分,並且您必須確保以某種方式修改了所有這些值。 API並不是爲此設計的,無論您使用過濾器還是攔截器。

因此,我建議您編寫一個Spring控制器,它接受「舊」路徑,並根據注入的EntityManager將請求轉發到「新」路徑。轉發可以通過讓控制器處理程序方法返回帶有「新」路徑的InternalResourceView來實現。這並不是嚴格意義上的轉發,但Spring不會知道其中的差別。或者,您可以直接使用request.getRequestDispatcher(newPath).forward(request, response)轉發。

+0

謝謝你的回答,它讓我意識到我是過度工程師的解決方案。一個簡單的'RequestMapping(value =「/ *」)似乎是我需要的。 – 2009-12-29 09:57:11

0

您可以使用正常的javax.servlet.Filter並創建一個HttpServletRequest - 爲您執行URL處理的打包程序。

0

也許包裝servlet請求並將其傳遞給過濾器鏈。

... 
MyHttpServletRequestWrapper wreq = new MyHttpServletRequestWrapper(request); 
doFilter(wreq, response, chain); 
... 

當提問時,包裝返回修改的URL。

0

我意識到這是一個古老的線程,而是我建議你擴展org.springframework.web.servlet.DispatcherServlet這樣 東西:

@Override 
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    try { 
     RequestImpl req = RequestImpl.wrapRequest(request, response); 
     request = req; 
     response = req.getResponse(); 
    } catch (Throwable t) { 
     //swallow  } 
    super.doDispatch(request, response); 
} 

然後參考該調度員在您的網頁。 xml爲:

<servlet> 
<servlet-name>dispatcher</servlet-name> 
<servlet-class>blah.com.MyDispatcher</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 

等等。看起來可怕的是擴展了Spring MVC的絕對核心類,但是如果你足夠大的話,在黑暗的註解日子之前,當真正的成年人仍然承諾我們都喜歡的漂亮的POJO框架時,重新使用Spring。

相關問題