ݺߣ

ݺߣShare a Scribd company logo
필터와 래퍼
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();	
	 }	
}	
!
이 클래스 내에서 재정의 할 함수들을 재정의하면 됨
Ad

Recommended

(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육
(C#,닷넷구조체강좌)구조체 개요 및 간단한 예제_닷넷,C#, WPF, 자마린실무교육
탑크리에듀(구로디지털단지역3번출구 2분거리)
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
탑크리에듀(구로디지털단지역3번출구 2분거리)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
(스프링 초보자를 위한)스프링 DI관련 어노테이션,자동스캐닝 컴포넌트(Spring Framework Auto-Scanning Component)
탑크리에듀(구로디지털단지역3번출구 2분거리)
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
탑크리에듀(구로디지털단지역3번출구 2분거리)
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
탑크리에듀(구로디지털단지역3번출구 2분거리)
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약
정아 손
자바와 사용하기2
자바와 사용하기2
destinycs
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
은숙 이
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
탑크리에듀(구로디지털단지역3번출구 2분거리)
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
Yu Yongwoo
Servlet3
Servlet3
Sukjin Yun
Servlet Architecture
Servlet Architecture
JU Chae
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
NAVER D2
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
탑크리에듀(구로디지털단지역3번출구 2분거리)
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
Hyuncheol Jeon
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초
Lee Geonhee
Xunittestpatternchapter11
Xunittestpatternchapter11
duaa83
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
탑크리에듀(구로디지털단지역3번출구 2분거리)
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
탑크리에듀(구로디지털단지역3번출구 2분거리)
One-day-codelab
One-day-codelab
WebFrameworks
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
Spring Boot 2
Spring Boot 2
경륜 이
스파르탄Js in sidejs4
스파르탄Js in sidejs4
Jin-Hyun Park
Spring Boot 1
Spring Boot 1
경륜 이
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
탑크리에듀(구로디지털단지역3번출구 2분거리)
JSP 프로그래밍 #03 서블릿
JSP 프로그래밍 #03 서블릿
Myungjin Lee
Role Of Server In Ajax Korean
Role Of Server In Ajax Korean
Terry Cho

More Related Content

What's hot (20)

스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
탑크리에듀(구로디지털단지역3번출구 2분거리)
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
Yu Yongwoo
Servlet3
Servlet3
Sukjin Yun
Servlet Architecture
Servlet Architecture
JU Chae
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
NAVER D2
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
탑크리에듀(구로디지털단지역3번출구 2분거리)
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
Hyuncheol Jeon
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초
Lee Geonhee
Xunittestpatternchapter11
Xunittestpatternchapter11
duaa83
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
탑크리에듀(구로디지털단지역3번출구 2분거리)
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
탑크리에듀(구로디지털단지역3번출구 2분거리)
One-day-codelab
One-day-codelab
WebFrameworks
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
Spring Boot 2
Spring Boot 2
경륜 이
스파르탄Js in sidejs4
스파르탄Js in sidejs4
Jin-Hyun Park
Spring Boot 1
Spring Boot 1
경륜 이
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
탑크리에듀(구로디지털단지역3번출구 2분거리)
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
Yu Yongwoo
Servlet Architecture
Servlet Architecture
JU Chae
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
NAVER D2
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
(국비지원/실업자교육/재직자교육/스프링교육/마이바티스교육추천)#13.스프링프레임워크 & 마이바티스 (Spring Framework, MyB...
탑크리에듀(구로디지털단지역3번출구 2분거리)
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
Hyuncheol Jeon
자료구조 복습 및 트리기초
자료구조 복습 및 트리기초
Lee Geonhee
Xunittestpatternchapter11
Xunittestpatternchapter11
duaa83
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
탑크리에듀(구로디지털단지역3번출구 2분거리)
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
탑크리에듀(구로디지털단지역3번출구 2분거리)
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
탑크리에듀(구로디지털단지역3번출구 2분거리)

Similar to Servlet jsp 13장 (20)

JSP 프로그래밍 #03 서블릿
JSP 프로그래밍 #03 서블릿
Myungjin Lee
Role Of Server In Ajax Korean
Role Of Server In Ajax Korean
Terry Cho
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1
J B
JSP 프로그래밍 #01 웹 프로그래밍
JSP 프로그래밍 #01 웹 프로그래밍
Myungjin Lee
스프링 3.0 & RESTful
스프링 3.0 & RESTful
JavaCommunity.Org
HeadFisrt Servlet&JSP Chapter 4
HeadFisrt Servlet&JSP Chapter 4
J B
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2
J B
[웹기반시스템 3조]e govframe 중간고사 제출 정리
[웹기반시스템 3조]e govframe 중간고사 제출 정리
구 봉
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
SeongHyun Ahn
Web server
Web server
Lee Geonhee
Restful web service
Restful web service
sunguen lee
Mvc 패턴
Mvc 패턴
Seokju Hong
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
dgmit2009
Spring mvc
Spring mvc
ksain
WAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apm
엑셈
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판
hyeonjae Cheon
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
NAVER D2
JSP 프로그래밍 #03 서블릿
JSP 프로그래밍 #03 서블릿
Myungjin Lee
Role Of Server In Ajax Korean
Role Of Server In Ajax Korean
Terry Cho
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1
J B
JSP 프로그래밍 #01 웹 프로그래밍
JSP 프로그래밍 #01 웹 프로그래밍
Myungjin Lee
HeadFisrt Servlet&JSP Chapter 4
HeadFisrt Servlet&JSP Chapter 4
J B
HeadFisrt Servlet&JSP Chapter 2
HeadFisrt Servlet&JSP Chapter 2
J B
[웹기반시스템 3조]e govframe 중간고사 제출 정리
[웹기반시스템 3조]e govframe 중간고사 제출 정리
구 봉
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
SeongHyun Ahn
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
dgmit2009
Spring mvc
Spring mvc
ksain
WAS의 동작과 WEB, Servlet, JSP_Wh apm
WAS의 동작과 WEB, Servlet, JSP_Wh apm
엑셈
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판
hyeonjae Cheon
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
NAVER D2
Ad

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(); } } ! 이 클래스 내에서 재정의 할 함수들을 재정의하면 됨