2012-03-27 53 views
3

我有一個過濾器:消除的Grails帶有過濾器的頁面請求時拋出一個404錯誤

class MyFilters { 
    def filters = { 
     before = { 
      render(view: "/test") 
      return false 
     } 
    } 
} 

這工作在哪裏我使用一個控制器來處理請求的頁面大,顯示出測試的內容.gsp而不是我要求的頁面。但是,當我嘗試訪問直接映射到GSP文件的頁面時,出現404錯誤。

將渲染更改爲簡單render "test"會產生相同的結果,就像註釋掉它並僅僅離開return false一樣。

回答

2

Grails是一個MVC框架。如果您想直接將URL映射到GSP(不通過控制器和操作進行重定向),則需要在您的UrlMappings.groovy中向Grails解釋此問題。在那裏你可以定義你的「快捷方式」。例如:

static mappings = { 
    "/$viewName"(view:"/index") { 
     constraints { 
      viewName([some constraints]) 
     } 
    } 
} 

這將不通過控制器渲染views/index.gsp。如果您沒有爲這些URL定義控制器映射(或至少一個視圖映射),則不能使用grails過濾器:

如果您確實想截取所有請求,您可以將servlet過濾器添加到您的grails應用程序中這樣的:

import javax.servlet.* 

import org.springframework.web.context.support.WebApplicationContextUtils; 

class TestFilter implements Filter { 

    def applicationContext 

    void init(FilterConfig config) throws ServletException { 
     applicationContext = WebApplicationContextUtils.getWebApplicationContext(config.servletContext) 
    } 

    void destroy() { 
    } 

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

     System.out.println("this filter has been called"); 
    } 
} 

在這裏你可以做你重定向或者基於applicationcontext和當前request效果。

您需要將此過濾器添加到您的web.xml。在如何做到這一點,看看:How do i use a servlet in my grails app?

+0

我應該澄清。我通常不會重定向到'/ test.gsp',只是在某些情況下,這就是爲什麼有必要使用過濾器而不是URL映射來做到這一點(除非有辦法制作條件映射?) – 2012-03-30 11:03:28

+0

什麼樣的約束你有?它是與DB有關還是一些靜態約束? – Chris 2012-03-30 13:14:41

+0

我正在檢查的東西與問題無關。這個問題沒有做任何檢查就存在。 – 2012-03-31 00:02:56

0

在我看來,你的應用程序正在做正確的事情。它顯示404是因爲/views/test.gsp不存在。當我將代碼更改爲以下代碼時,它適用於我。

class MyFilters { 
    def filters = { 
     StackOverflowTestFilter (controller:'*') { 
      before = { 
       render("Hello World!") 
       // also fine: render(controller:"mycontroller", action:"myaction") 
       return false 
      } 
     } 
    } 
} 

另外,你是否知道,返回false將始終取消流的其餘部分?僅當過濾器發現某些違規行爲是您要過濾的內容時才返回false

希望這會有所幫助!

+0

'/ views/test.gsp'確實存在。當我在通過控制器生成的頁面上使用相同的過濾器時,它顯示正常,但是在通過GSP生成的頁面上,我得到了奇怪的404錯誤。 – 2012-03-30 11:04:27

+0

還要注意,只是在過濾器中執行「渲染」測試「'也會產生404錯誤。這似乎與'返回虛假'有關。 – 2012-03-30 11:05:16

+0

您是否嘗試過我發佈的代碼?它正在返回* false *並且正在破壞* Hello World * - 所以這絕對不是。我還注意到,你沒有在你的例子中定義一個過濾器名稱和範圍(在我的例子中是'stackOverflowTestFilter(controller:'*')')。看看[Grails文檔](http://grails.org/doc/latest/guide/theWebLayer.html#applyingFilters),似乎你必須提供這個。 – fluxon 2012-03-30 13:49:39

0

你可以用Grails的狀態參數輕鬆設置HTTP狀態代碼渲染方法

我還沒有和過濾器,但在Grails的控制器,它的工作原理beforeIntecerptors測試這一點。

class MyFilters { 
    def filters = { 
     before = { 
      render(view: "/test", status:200) 
      return false 
     } 
    } 
} 
相關問題