SlideShare a Scribd company logo
1 of 15
Download to read offline
필터와 래퍼
Servlet&JSP 13장
구현은 다 했는데…
• 자꾸만 요구사항이 변한다.
• 이번에는 모든 사용자에 대해서 정보를 추적하라고…
• 어떻게?
구현 변화
• 많고 많은 서블릿 정보를 다 수정할 수 있겠지
• 너무 귀찮다.
• 어떻게 하지?
필터
• 자바 컴포넌트
• 서블릿으로 요청이 넘어가기 전에 요청을 가로채거나
• 서블릿에서 뷰로 응답이 넘어가기 전에 응답을 가로채거나
설정
• 모듈식으로 DD에 설정한다.
<filter>	
	<filter-name>BeerReq</filter-name>	
	<filter-class>com.example.web.BeerReqFilter</filter-
class>	
	<init-param>	
		 <param-name>LogFileName</param-name>	
		 <param-value>UserLog.txt</param-value>	
	</init-param>	
</filter>
얘는 없어도 됨
URL과 필터 매핑
<filter-mapping>	
	<filter-name>BeerReq</filter-name>	
	<url-pattern>*.do</url-pattern>	
</filter-mapping>
얘가 앞에 filter-name 하고 같아야 함
서블릿 이름과 필터 매핑
!
<filter-mapping>	
	 <filter-name>BeerReq</filter-name>	
	 <servlet-name>AdviceServlet</servlet-name>	
</filter-mapping>
얘가 앞에 filter-name 하고 같아야 함
요청 디스패쳐로는?
!
<filter-mapping>	
	<filter-name>BeerReq</filter-name>	
	<url-pattern>*.do</url-pattern>	
	<dispatcher>REQUEST</dispatcher>	
<— REQ —>	
	<dispatcher>INCLUDE</dispatcher>	
<— INC —>	
	<dispatcher>FORWARD</dispatcher>	
<— FOR —>	
</filter-mapping>
Filter 실행 순서
• URL -> servlet-name 순으로
• 디테일 한 것부터 매칭됨
필터를 만들자
package com.example.web;	
!
import java.io.IOException;	
!
import javax.servlet.*;	
import javax.servlet.http.HttpServletRequest;	
!
public class BearRequestFilter implements Filter{	
	 private FilterConfig fc;	
	 public void init(FilterConfig config) throws ServletException {	
	 	 this.fc = config;	
	 }	
	 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws
ServletException, IOException {	
	 	 HttpServletRequest httpReq = (HttpServletRequest) req;	
	 	 String name = httpReq.getRemoteUser();	
	 	 if(name != null) {	
	 	 	 fc.getServletContext().log("User " + name + "is updating");	
	 	 }	
	 	 chain.doFilter(req, resp);	
	 }	
	 	
	 public void destroy() {	
	 	 	
	 }	
}
응답 필터
• 이전 것이 요청 필터임
• 필터는 Request를 가로챌 수도 있지만 Response를 가
로챌 수도 있음
• doFilter 메소드 이후에 response를 가로채는 로직을 사
용할 수 있음
Is it OK?
• 출력은 필터를 기다려주지 않고 떠나가버림림
• 그러므로 doFilter 이후에 Response를 낚아채는 코드를
작성해도 이미 출력해버림
• 그럼 어떻게?
Servlet Wrapper
• HttpsServletResponse를 직접 구현하는건 무리
• Wrapper 클래스를 구현함
• Wrapper 클래스는 원래 response객체를 wrapping해
서, 들어오는 요청을 이 객체로 위임함
• ServletRequestWrapper/
HttpServletRequestWrapper/
ServletResponseWrapper/
HttpServletResponseWrapper
Wrapper
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws ServletException, IOException {	
	 	 HttpServletRequest httpReq = (HttpServletRequest) req;	
	 	 String name = httpReq.getRemoteUser();	
	 	 if(name != null) {	
	 	 	 fc.getServletContext().log("User " + name + "is updating");	
	 	 }	
	 	 CompressionResponseWrapper wrappedResp = new 	 	 	 	 	
CompressionResponseWrapper(response);	
	 	 chain.doFilter(req, wrappedResps);	
}
Compression…
public class CompressionResponseWrapper extends
HttpServletResponseWrapper{	
	 @Override	
	 public ServletOutputStream getOutputStream() throws IOException {	
	 	 	
	 	 return super.getOutputStream();	
	 }	
}	
!
이 클래스 내에서 재정의 할 함수들을 재정의하면 됨

More Related Content

What's hot

Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver진상 문
 
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)Yu Yongwoo
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet ArchitectureJU Chae
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttpNAVER D2
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsHyuncheol Jeon
 
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초자료구조 복습 및 트리기초
자료구조 복습 및 트리기초Lee Geonhee
 
Xunittestpatternchapter11
Xunittestpatternchapter11Xunittestpatternchapter11
Xunittestpatternchapter11duaa83
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
스파르탄Js in sidejs4
스파르탄Js in sidejs4스파르탄Js in sidejs4
스파르탄Js in sidejs4Jin-Hyun Park
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...탑크리에듀(구로디지털단지역3번출구 2분거리)
 

What's hot (20)

스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver
 
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
 
Servlet3
Servlet3Servlet3
Servlet3
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet Architecture
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
 
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초자료구조 복습 및 트리기초
자료구조 복습 및 트리기초
 
Xunittestpatternchapter11
Xunittestpatternchapter11Xunittestpatternchapter11
Xunittestpatternchapter11
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
스파르탄Js in sidejs4
스파르탄Js in sidejs4스파르탄Js in sidejs4
스파르탄Js in sidejs4
 
Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
 

Similar to Servlet jsp 13장

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
E government framework
E government frameworkE government framework
E government frameworkHyungKuIm
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기corund
 
[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략NAVER Engineering
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC Ji-Woong Choi
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우NAVER D2
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVCAnselmKim
 
vine webdev
vine webdevvine webdev
vine webdevdcfc1997
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈jihoon kim
 
Jsp convert to Servlet
Jsp convert to ServletJsp convert to Servlet
Jsp convert to ServletJU Chae
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5Hyeonseok Yang
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Younghan Kim
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영NAVER D2
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Androidtaeinkim6
 

Similar to Servlet jsp 13장 (20)

4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
E government framework
E government frameworkE government framework
E government framework
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
스프링 3.0 & RESTful
스프링 3.0 & RESTful스프링 3.0 & RESTful
스프링 3.0 & RESTful
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기
 
[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
 
[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우[112]rest에서 graph ql과 relay로 갈아타기 이정우
[112]rest에서 graph ql과 relay로 갈아타기 이정우
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
vine webdev
vine webdevvine webdev
vine webdev
 
okspring3x
okspring3xokspring3x
okspring3x
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
제2회 한글형태소분석기 기술 세니마 발표(solr 활용 입문) by 김지훈
 
Jsp convert to Servlet
Jsp convert to ServletJsp convert to Servlet
Jsp convert to Servlet
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5[Study]HeadFirst JSP&servlet chapter5
[Study]HeadFirst JSP&servlet chapter5
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
 
MVVM Pattern for Android
MVVM Pattern for AndroidMVVM Pattern for Android
MVVM Pattern for Android
 

Servlet jsp 13장

  • 2. 구현은 다 했는데… • 자꾸만 요구사항이 변한다. • 이번에는 모든 사용자에 대해서 정보를 추적하라고… • 어떻게?
  • 3. 구현 변화 • 많고 많은 서블릿 정보를 다 수정할 수 있겠지 • 너무 귀찮다. • 어떻게 하지?
  • 4. 필터 • 자바 컴포넌트 • 서블릿으로 요청이 넘어가기 전에 요청을 가로채거나 • 서블릿에서 뷰로 응답이 넘어가기 전에 응답을 가로채거나
  • 5. 설정 • 모듈식으로 DD에 설정한다. <filter> <filter-name>BeerReq</filter-name> <filter-class>com.example.web.BeerReqFilter</filter- class> <init-param> <param-name>LogFileName</param-name> <param-value>UserLog.txt</param-value> </init-param> </filter> 얘는 없어도 됨
  • 7. 서블릿 이름과 필터 매핑 ! <filter-mapping> <filter-name>BeerReq</filter-name> <servlet-name>AdviceServlet</servlet-name> </filter-mapping> 얘가 앞에 filter-name 하고 같아야 함
  • 8. 요청 디스패쳐로는? ! <filter-mapping> <filter-name>BeerReq</filter-name> <url-pattern>*.do</url-pattern> <dispatcher>REQUEST</dispatcher> <— REQ —> <dispatcher>INCLUDE</dispatcher> <— INC —> <dispatcher>FORWARD</dispatcher> <— FOR —> </filter-mapping>
  • 9. Filter 실행 순서 • URL -> servlet-name 순으로 • 디테일 한 것부터 매칭됨
  • 10. 필터를 만들자 package com.example.web; ! import java.io.IOException; ! import javax.servlet.*; import javax.servlet.http.HttpServletRequest; ! public class BearRequestFilter implements Filter{ private FilterConfig fc; public void init(FilterConfig config) throws ServletException { this.fc = config; } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpReq = (HttpServletRequest) req; String name = httpReq.getRemoteUser(); if(name != null) { fc.getServletContext().log("User " + name + "is updating"); } chain.doFilter(req, resp); } public void destroy() { } }
  • 11. 응답 필터 • 이전 것이 요청 필터임 • 필터는 Request를 가로챌 수도 있지만 Response를 가 로챌 수도 있음 • doFilter 메소드 이후에 response를 가로채는 로직을 사 용할 수 있음
  • 12. Is it OK? • 출력은 필터를 기다려주지 않고 떠나가버림림 • 그러므로 doFilter 이후에 Response를 낚아채는 코드를 작성해도 이미 출력해버림 • 그럼 어떻게?
  • 13. Servlet Wrapper • HttpsServletResponse를 직접 구현하는건 무리 • Wrapper 클래스를 구현함 • Wrapper 클래스는 원래 response객체를 wrapping해 서, 들어오는 요청을 이 객체로 위임함 • ServletRequestWrapper/ HttpServletRequestWrapper/ ServletResponseWrapper/ HttpServletResponseWrapper
  • 14. Wrapper public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpReq = (HttpServletRequest) req; String name = httpReq.getRemoteUser(); if(name != null) { fc.getServletContext().log("User " + name + "is updating"); } CompressionResponseWrapper wrappedResp = new CompressionResponseWrapper(response); chain.doFilter(req, wrappedResps); }
  • 15. Compression… public class CompressionResponseWrapper extends HttpServletResponseWrapper{ @Override public ServletOutputStream getOutputStream() throws IOException { return super.getOutputStream(); } } ! 이 클래스 내에서 재정의 할 함수들을 재정의하면 됨