2011-06-01 43 views
2

根據這個mailinglist entry,grails過濾器應該在前向調用。這有效地導致過濾器被調用1 + x number of forwardsgrails過濾器在這個例子中運行兩次?

但是,在我的情況下,我質疑這是如何完成的方法。下面是我的系統的一個粗略的混搭:

  • 我有這對"/api/**"
  • 即是這樣一個urlMapping中的URI狀態調用的過濾器:"/api/$version/$apiKey/$rest**"
    • $rest可能含有(作爲例子)的值/book/show/1
  • 這就是唯一目的的ApiController是轉發至另一個URI取決於$rest

因此,讓我說我訪問url /api/0.1/Ks38...7fn38/book/show/1然後會發生的是,api過濾器被調用,它執行所有的版本和apiKey驗證。然後它繼續轉發到uri /book/show/1,然後再次調用Api過濾器,即使過濾器被重新映射到/api/**並且新的uri實際上是/book/...。現在讓我們說,我同意過濾器應該在前鋒上被調用,但我不同意,當我正在向前轉時,應該再次調用api過濾器/book...

這不能是正確的行爲?它可以?

+0

加入此以GRAILS http://jira.grails.org/browse/GRAILS-7579與樣品應用 – netbrain 2011-06-01 19:44:07

回答

0

我遇到了同樣的問題,並在Grails郵件列表中詳細討論了它。這種行爲自1.2.x之前就已經存在,並且不太可能改變。

因此,我通過在我的「ApiController」中轉發之前添加一個flash參數(flash.apiValid = true)來「修復」這個問題,然後在我的過濾器中進行檢查以防止ApiController再次呼叫。

雖然這可能不是最優雅的解決方案,但它是一種可行的解決方案。希望它也能幫助你。

+1

一個錯誤我想出了一個不同的解決方法: '之前= {DEF requestUrl = WebUtils.getRequestURIForGrailsDispatchURI(請求) if(requestUrl.startsWith('/ api')){do something}} – netbrain 2011-09-14 13:03:31

0

好,前鋒在技術上不是一個新的'請求',並使用原始請求。如果您將forwardUri與控制器/操作進行比較,您會注意到更改。這就是API工具包如何處理鏈接並避免這種衝突。