Intercepting Filter
Brief Description
대부분의 어플리케이션들은 보안과 로깅과 같은 모든 어플리케이션 request들에 적용할 수 있는 어떤 요구사항들을 가지고 있다. 각각의 어플리케이션 서비스에 이런 기능을 추가하려면 시간이 걸리고, 에러가 발생하기 쉽고, 유지가 어렵게 된다. 이런 서비스들을 front controller에 구현하더라도 서비스들을 추가하거나 제거하기 위해서는 코드의 변경이 여전히 요구된다. 아래의 그림 1의 sequence diagram은 각각의 웹 리소스가 그런 서비스들을 개별적으로 호출하는 방식을 보여준다.
Figure 1. Before Intercepting Filter
Intercepting Filter 패턴은 현재의 어플리케이션 리소스들을 request의 수신과 response의 발신을 가로채는 일을하는 filter로 감싼다. intercepting filter는 어플리케이션 request들을 pre-process 또는 redirect 한다, 그리고 어플리케이션 response들의 컨텐츠를 post-process 또는 replace 한다. 또한 Intercepting filter들은 소스 코드의 변경 없이 현재의 웹 리소스들에 chain of separate와 declaratively-deployable service들을 추가하기 위해 다른것들 위에 놓여질 수 있다. 아래의 그림 2는 두개의 intercepting filter들의 연결이 그들이 감싸고 있는 두개의 웹 리소스에 대한 request들을 가로채는것을 보여준다.
Figure 2. After Intercepting Filter
Detailed Description
See the Core J2EE Patterns
Detailed Example
Java 2 Platform, Enterprise Edition (J2EE) platform 안의 Servlet Filter interface는 Intercepting Filter 패턴의 직접적인 구현이다. 예제 어플리케이션은 두개의 servlet filter들을 정의한다: 하나는 사용자의 signon을 전달하고, 다른 하나는 response encoding을 실행한다.
● The user signon filter.
예제 어플리케이션 클래스 SignOnFilter는 pet store front controller에 대한 모든 request들을 가로채는 일을 하는 intercepting filter 이다. SignOnFilter servlet filter는 사용자 signon이 요구되는 페이지들에 대한 request들을 감지하고 현재 로그온된 사용자가 없다면 사용자 로그인 페이지로 그런 request들을 redirect 한다. 이 프로세서의 자세한 설명은 User Signon and Customer Registration Module에 나와 있다 (온라인 문서 예제 어플리케이션 디자인과 구현의 일부분 [ BT-SADI02 ]).
● The encoding filter.
예제 어플리케이션 클래스 EncodingFilter는 pet store front controller로 부터의 response들을 수정하는 intercepting filter 이다. response의 encoding은 항상 일관되게 셋팅되어 있어야 한다는 것을 유의하라.
○ EncodingFilter 클래스에서 발췌한 아래의 코드 예제는 servlet filter가 각각의 response의 response encoding을 셋팅하고 그 request를 체인의 아래에 있는 다음 filter에 넘기는 방식을 보여준다. filter chain mechanism은 그런 filter들을 구성할 수 있도록 만들어 준다, 그래서 여러개의 intercepting filter들이 하나의 리소스를 감쌀수 있다.
public void doFilter(ServletRequest srequest,
ServletResponse sresponse,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)srequest;
request.setCharacterEncoding(targetEncoding);
// move on to the next
chain.doFilter(srequest,sresponse);
}
○ pet store 웹 어플리케이션 description web.xml 파일에서 발췌한 아래의 부분은 encoding filter가 "/*"(어플리케이션 컨텍스트 루트에 상대적인)에 메칭되는 모든 request들을 감싸도록 설정하는 방법을 보여준다.
<!-- Encoding Filter Mapping Start-->
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
------------------------------------------------------------------------------------
원본 : http://java.sun.com/blueprints/patterns/InterceptingFilter.html
번역 : 김운주 ounju@naver.com
J2EE Patterns Catalog
http://blog.naver.com/ounju/140035283520
댓글 없음:
댓글 쓰기