2010-01-13 3 views

답변

44

서블릿 필터는 Chain of responsibility 디자인 패턴을 구현 한 것입니다.

모든 필터는 web.xml에서 정의 된 순서로 연결됩니다. chain.doFilter()이 체인의 다음 요소로 진행 중입니다. 체인의 마지막 요소는 대상 자원/서블릿입니다.

13

chain 개체의 doFilter 메서드를 호출하므로 자체적으로 호출하지 않으므로 재귀 적으로 실행되지 않습니다.

이름이 chain 인 경우 일련의 필터가 있고 각 필터가 처리를 수행하고 다음 순서로 전달되므로 각 개체에 시퀀스의 다음 필터를 가리키는 chain 멤버가있는 것이 좋습니다. 필터가 자체 처리를 수행 한 후에 호출됩니다. 시퀀스의 마지막 부분은 null이고 값은 chain이거나 시퀀스 자체의 마지막 부분임을 자체적으로 알고 있습니다.

1

내부적으로 필터 체인에서 다음 필터의 doFilter을 호출하고 체인이 끝나면 대상 서블릿을 호출합니다.

0

chain.doFilter를 호출하면 필터 체인의 다음 필터로 요청/응답을 전달할 수 있습니다. 호출하지 않으면 다음 필터 (아마도 web.xml에 정의되어 있음)가 실행되지 않습니다.

방금 ​​doFilter를 호출했다면 그렇습니다. 무한 재귀와 stackoverflow가 있습니다. 그러나 filterChain 객체의 doFilter 메서드를 호출하면 다음 필터를 실행하도록 지시합니다.

0

얘기하는 코드를 가지고 있지, 난 단지 추측 할 수 있습니다 뭔가 같은 그 : 그런 경우

class Filter implements FilterAPI { 
    private FilterAPI chain; 
    FilterAPI(FilterAPI chain) { this.chain = chain; } 
    @override void doFilter (Set setToFilter) { 
    // do some filtering on setToFilter 
    chain.doFilter(setToFilter); 
    } 
} 

, 반복적으로, 당신은 doFilter를 호출 한 다음 호출하지 않는 것을() 다른 개체에. 다른 대답에서 언급했듯이, 이것은 잘 알려진 Chain of Responance 디자인 패턴입니다.

+1

이것이 C# 인 것으로 보입니다.이 게시물은 java로 표시됩니다. 그러나 대답은 여전히 ​​정확합니다. – gbtimmon

+0

위의 코드가 유효한 Java 코드라고 생각합니까? 방금 생성자 이름을 고정 시켰습니다 ... –

+0

필자는 필자가 필자의 필자가 java.appvlet.Filter의 filterAPI 인터페이스를 본 적이 없기 때문에 혼란 스러웠습니다. 나는 그저 내 자신의 무지를 재현합니다. FilterAPI는 어디에서 왔습니까? – gbtimmon

1

체인의 다음 필터가 호출되도록하거나 호출 필터가 체인의 마지막 필터 인 경우 체인의 끝에있는 자원을 호출하게합니다.

관련 문제