일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- properties 파일 주입
- properties 변수
- properties 파일
- 오라클 DROP
- JSR - 303
- 코드로 배우는 스프링 웹 프로젝트
- 자바
- Spring 객체로 주입받기
- Spring
- Spring message
- Spring 커맨드 객체
- DDL DROP
- Spring MVC5 기본 세팅
- 오라클 CREATE
- annotation
- ddl alter
- 자바오류
- 자바스크립트
- JSR - 380
- Spring MVC Interceptor
- 자바 List
- Mybatis 오류
- 오라클 TRUNCATE
- Dependency Injection
- DDL TRUNCATE
- collection framework
- Servlet cookie
- 스프링 파라미터 추출
- 스프링 인터셉터
- Spring Cookie
- Today
- Total
개발이좋아
[Servlet] 필터 Filter API 본문
필터란 브라우저에서 서블릿에게 요청하거나 응답할 때 미리 요철이나 응답과 관련해 여러 가지 로직을 수행하는 기능이다.
예를 들어 서블릿에서 요청을 받을 때 한글로 받기 위해서 request 객체의 setCharsetCharacterEncoding메서드를 매번 코딩하기보다는 필터에 구현해 놓고 여러 서블릿에서 사용하면 반복 작업할 필요가 사라진다.
필터는 용도에 따라 요청필터와 응답 필터로 나뉜다.
요청 필터
- 사용자 인증 및 권한 검사
- 요청 시 요청 관련 로그 작업
- 인코딩 기능
응답 필터
- 응답 결과에 대한 암호화 작업
- 서비스 시간 측정
필터 관련 API는 아래와 같다.
- javax.servlet.Filter
- javax.servlet.FilterChain
- javax.servlet.FilterConfig
Filter 인터페이스에는 생명주기의 맞춰 아래와 같이 여러 메서드가 제공된다.
Filter 인터페이스의 메서드
메서드 | 기능 |
destroy( ) | 필터가 소멸 시 컨테이너에 의해 호출되며 종료 작업을 수행 |
doFilter( ) | 요청/응답 시 컨테이너에 의해 호출되어 기능을 수행 |
init( ) | 필터 생성 시 컨테이너에 의해 호출되어 초기화 작업을 수행 |
FilterConfig의 메서드
메서드 | 기능 |
getFilterName( ) | 필터 이름을 반환 |
getInitParameter(String name) | 매개변수 name에 대한 값을 반환 |
getServletContext( ) | ServletContext 객체를 반환 |
사용자 정의 필터
개발자가 직접 필터를 만들 수도 있다.
직접 필터를 만들 때는 반드시 Filter 인터페이스를 구현해야 하며 init( ), doFilter( ), destroy( )의 추상 메서드를 구현해야 한다.
또 한 필터를 생성하면 각각의 요청에 맞게 적용하기 위하여 필터 매핑을 해야 한다.
필터를 매핑하는 방법은 Annotation을 이용하는 방법과 web.xml에 설정하는 방법 2가지가 있으며,
일반적으로 Annotation을 이용하는 방법을 주로 쓴다.
아래는 Annotation을 이용하여 필터로 한글 인코딩 처리하는 예제이다.
원래는 한글 인코딩 처리를 위하여 request.setCharacterEncoding("utf-8"); 를 코딩해야 하지만 필터 기능을 이용하기 때문에 생략이 가능하다.
html 파일에서 form태그로 받은 정보를 화면에 뿌려주는 간단한 예제이다.
위의 서블릿 파일에 정보를 넘겨주는 html 파일을 실행시켜 이름과 비밀번호를 입력한다.
필터 기능을 위해 이름을 한글로 작성하였다.
아직 필터 기능을 적용하지 않았기 때문에 실행결과에 이름은 알 수 없는 문자로 나오게 된다.
위 사진처럼 한글이 깨지는 현상이 일어난다.
이제 Filter를 적용해보도록 하자.
새로 Filter파일을 생성한다.
Class name을 입력하고 Next
모든 요청에 대하여 필터 기능을 적용하기 위해 매핑 정보를 바꿔준다.
빨간 선의 /EncoderFilter를 클릭한 후 Edit
모든 요청의 작동하도록 Pattern을 *로 바꾸어준 후 OK -> Finish
Filter파일을 생성하면 아래와 같다. 위에서 설명한 Filter인터페이스의 메서드들을 구현하고 있다.
가장 위를 보면 @WebFilter로 어노테이션을 이용하는 모습을 확인할 수 있다.
doFilter 메서드는 매개변수로 request와 response가 전달되며 FilterChain의 chain이 3번째 매개변수로 전달된다.
여기서는 전달된 request로 한글 인코딩 작업을 해준다.
여기서 주의할 점이 있는데 request의 관한 기능은 chain.doFilter(request, response)의 윗부분에 코딩을 해주어야 한다.
그 이유는 chain.doFilter(request, response)를 기준으로 윗부분은 요청인 request 아랫부분은 응답인 response 필터 기능을 수행하기 때문이다.
그러므로 코딩을 할 때 각 요청과 응답의 위치를 잘 구분하여 코딩해야 한다.
그럼 이제 다시 html 파일에서 한글을 입력하고 결과를 보면 아래와 같다.
처음과는 달리 한글이 잘 출력되는 것을 확인할 수 있다.
위와 같이 매번 코딩해야 하는 부분을 필터를 통해 미리 구현해 놓으면 편리하게 이용할 수 있다.
본 포스팅은 필자가 공부한 것을 정리해 놓은 것으로 오류가 존재할 수 있습니다.
참고 : 자바 웹을 다루는 기술
'Web개발 > JSP & Servlet' 카테고리의 다른 글
[JSP] 액션 태그 useBean 액션 태그와 setProperty, getProperty 액션 태그 (0) | 2019.12.27 |
---|---|
[JSP] java.sql.SQLSyntaxErrorException: ORA-00926: missing VALUES keyword (0) | 2019.12.26 |
[JSP] JSP 내장 객체 (0) | 2019.12.25 |
[JSP] jsp 구성 요소 및 디렉티브(지시) 태그 (0) | 2019.11.17 |
[JSP] org.apache.jasper.JasperException (0) | 2019.11.17 |