2009-08-10 8 views
7

Grails는 컨트롤러 전에 실행되는 filters을 제공합니다. 그들은 다음과 같이 클래스에 정의하고 있습니다 :Grails 필터 구문 또는 Grails 외부에서 Grails 필터를 호출하는 방법

class SecurityFilters { 
    def filters = { 
     myFilter(controller:'*', action:'*') { // What are those weird colons?? 
      print "I'm filtering!" 
      // Code that does the filtering goes here 
     } 
    } 
} 

이는 잘 작동하지만 난 그게 내가 전에 본 적이있는 그루비 코드처럼 보이지 않는 더 나은 구문을 이해하고 싶습니다. 특히, 위의 라인은 myFilter으로 시작하여 매우 이상하게 보입니다. 이것은 myFilter이라는 메서드에 대한 메서드 정의입니까? 그렇다면 각 매개 변수 뒤에 :'*'의 의미는 무엇입니까? 기본 매개 변수 값일 수 있다고 생각했지만 ='*'이됩니다. 에서 콜론을 사용하는 명명 된 매개 변수를 본 적이 있는데 을 정의하지 않았기 때문에을 호출하기 전에이 메서드를 호출 할 수 없습니다.

일반 Groovy 클래스에서 필터링 코드를 실행하는 방법을 누군가에게 알려주면 훨씬 더 잘 이해할 수있을 것 같습니다. 즉, 위의 행을 포함하는 MyFilters.groovy 파일이있는 경우이 Groovy 코드를 마무리하여 "필터링 중"을 인쇄 할 수 있습니까?

import MyFilters 
def mf = new MyFilters() 
mf.filters.somethingGoesHere // Help! How do I finish this line so it calls my filtering code? 
+0

큰 질문 다람쥐! 나는 지금 막 동일한 문제로 싸우고있다 - 그것을 묻기를위한 감사합니다! – alpian

+0

나는 무엇인가를 알고 싶어한다. ... 나는 거의 자지 않는다, 웃는다! – Topera

답변

5

다음 그루비 코드는 "나는 필터링하고있어!"인쇄 할 것이다 :

class SecurityFilters { 
    def filters = { 
     myFilter(controller:'*', action:'*') { // What are those weird colons?? 
      print "I'm filtering!" 
      // Code that does the filtering goes here 
     } 
    } 
} 

class FilterDelegate { 
    def methodMissing(String methodName, args) { 
     // methodName == myFilter 
     // args[0] == [controller:*, action:*] 
     // args[1] == {print "I'm filtering!"} 
     args[1].call() 
    } 
} 

def sf = new SecurityFilters() 
def filtersClosure = sf.filters 
filtersClosure.delegate = new FilterDelegate() 
filtersClosure.call() 

이 예제 필터에서하는 방법이 myFilter 이름을 호출하고지도와 클로저를 전달하는 클로저이다. 당신은 myFilter 생각할 수 :

myFilter([controller:'*', action:'*'], closure) 

지도 CAN 컨트롤러, 액션 또는 URI 같은 키가 포함되어 있습니다. 와일드 카드 (*)는 Grails가 호출 할 클로저를 결정할 때 HTTP 요청의 URI를 일치 시키려고 할 때 사용됩니다.

Grails가 필터를 처리하는 방법을 이해하면 델리게이트 로더 클래스가 사용된다는 것입니다. 로더 클래스는 methodMissing 메서드를 제공하고 필터 클로저 내부의 각 메서드 호출에 대한 FilterConfig를 만듭니다. HTTP 요청이 이루어지면, Grails는 모든 FilterConfig 객체를 살펴보고 일치하는 스코프를 찾는다. (컨트롤러, 액션, uri 맵을 찾아 와일드 카드와 일치시키기 위해 정규 표현식을 사용한다.) 일치하는 것을 찾으면 Filter 클래스의 메서드에 전달 된 클로저를 호출합니다.

+0

위대한 설명 - 감사합니다! –

0

grails 외부에서 쉽게 필터를 호출 할 수 있습니다. 필터는 설정되지 않는 많은 배관 작업에 의존하기 때문에 쉽게 호출 할 수 없습니다.
myFilter (컨트롤러 : '', 동작 : '')
은 두 개의 인수, 컨트롤러 및 동작 패턴을 사용하는 메서드 정의입니다. *는이 필터를 진행 유형의 모든 객체에 적용한다는 것을 의미합니다. 예를 들어 권한이 부여되지 않으면 사용자가 아무 것도 만들지 못하도록하려면 다음 필터를 사용합니다.
컨트롤러 : '*', 동작 : '생성'
이것은 작성 액션이 호출 될 때마다 해당 함수 본문에 저장된 코드가 실행되지만 list, show 또는 edit 필터는 실행되지 않는다는 것을 의미합니다. 정말로 세부 사항을 원한다면 항상 grails 소스 코드를 다운로드 할 수 있습니다.
편집 :
코드는 필터에 정의 된 함수이므로 컴파일됩니다.

+0

감사합니다. 필터와 컨트롤러 및 액션 패턴이 Grails에서 어떻게 작동하는지 알고 있습니다. 그러나 위에 표시된 MyFilter 코드가 왜 합법적 인 Groovy인지 궁금합니다.그것은 컴파일하지만 왜 작동하지 않을 수 있습니다! –