TIL/View Template

[SIST] JSP_days09_필터(Filter)

야리니 2022. 6. 27. 01:34
728x90
반응형

1. 필터(Filter)란?

필터 요약 : http 요청할 때 올바른 요청 + 요청 권한 체크 또는 응답할 때 응답 데이터를 변경(암호화) 등등을 할 수 있는 클래스

 

- 필터는 HTTP 요청과 응답을 변경할 수 있는 '재사용 가능한 클래스'


- 필터는 개체의 형태로 존재하며 클라이언트에서 오는 요청(request)과 최종 자원(JSP, 서블릿) 사이에 위치하여 클라이언트의 요청 정보를 알맞게 변결할 수 있다.


- 필터는 최종 자원과 클라이언트로 가는 응답 사이에 위치하여 최종 자원의 요청 결과를 알맞게 변경할 수도 있다.


- 여러 개의 필터가 모여 하나의 필터 체인을 형성할 수도 있음


- 필터는 웹 컨테이너 안에서 일어남

 

ex) 로그인을 했으면 A 페이지로 안했으면 B 페이지를 보여주기 전에 필터를 통해 로그인이 되었는지 확인

출처 : 최범균의 JSP


2. 필터 체인(Filter Chain)

- 클라이언트와 자원 사이에 한 개의 필터만 존재할 수 있는 것은 아니다.

 

- 여러 개의 필터가 모여 하나의 필터 체인을 형성하게 된다.

출처 : 최범균의 JSP


3. 필터 구현 방법 3가지

ㄱ. javax.servlet.Filter 인터페이스 구현

1)  init()    필터 초기화 역할(필터를 초기화할 때 호출 )
2)  destory() 필터 웹컨테이너에서 소멸(삭제)될때 호출되는 메서드
3)  ***** doFilter() **** 필터 기능 수행, chain을 이용해서 체인의 다음 필터로 처리를 전달할 수 있음
   - 필터링할 작업( 코딩 ) : 인증, 권한 등등
   - 체크된 후에는   다음 필터 또는 자원에게  chain 을 이용해서 전달.
                                                                       chain.doFilter()

 

ㄴ. 요청 - javax.servlet.ServeltRequestWrapper 클래스

필터가 요청을 변경한 결과를 저장하는 래퍼 클래스
currentPage=1 파라미터를 가공(변경) 초기화  

ㄷ. 응답 - javax.servlet.ServletResponseWrapper 클래스 

필터가 응답을 변경하기 위해 사용하는 래퍼클래스
원본데이터 -> 암호화데이터  


4. 필터 클래스를 사용하려면 톰캣\lib\servlet-api.jar 파일을 추가해야하지만, 이클립스로 개발할 경우에는 추가할 필요가 없다.


5. init(FilterConfig 객체 config) 메서드

- init 메서드에 전달되는 FilterConfig는 필터의 초기화 파라미터를 읽어올 때 사용하며, 제공하는 메서드는 4가지가 있다.

 

1) String getFilterName() : 설정파일에서 <filter-name> 필터이름을 반환.

2) String getInitParameter(name) :       <init-param>

3) getInitParameterNames()

4) ServletContext  getServletContext() :  서블릿 컨텍스트 객체 

출처 : 최범균의 JSP


6. 필터 설정하는 2가지 방법

1) web.xml

- dispatcher 태그를 사용하면 필터가 적용되는 시점 설정 가능
    ㄴ REQUEST(기본값) : 클라이언트의 요청인 경우 필터 적용
    ㄴ FORWARD : forward()를 통해 제어 흐름을 이동하는 경우 필터 적용
    ㄴ INCLUDE : include()를 통해 포함되는 경우 필터 적용

 

2) @WebFilter 어노테이션

- @WebServlet과 사용법이 동일함


7. 필터 사용하는 곳

1) 요청

- 인증/권한 체크하고자 할 때

- 어떤 자원(JSP, 서블릿, 특정 이미지, 동영상 등등)에 로깅할 때

 

2) 응답

- 응답하고자 하는 데이터를 변환할 때(암호화, xml 변환, html 변환)

- 공통적인 부분이 있다면 필터로 만들어서 재사용 가능


8. 예시

8-1)

ex02.jsp form 태그 POST 방식으로 ex02_ok.jsp 한글 서브밋


ex02_ok.jsp 한글 깨짐
ㄴ [한글이 안깨지도록 필터를 추가하고 설정하기]
(모든 페이지마다 request.setChar해도 되고 공통모듈화 해도 되지만 필터를 사용하는 것이 더 좋음)

1) 인코딩 필터 클래스 추가
     com.filter.CharacterEncodingFilter.java
     src 우클릭 New -> Filter도 있지만 이번에는 class로 만듦


2) 필터 등록 - web.xml
    모든 요청을 할 때 CharacterEncodingFilter.doFilter() 호출됨

 

[CharacterEncodingFilter.java - 필터 클래스]

 

[web.xml]

 

[ex02.jsp]

 

[ex02_ok.jsp]


8-2)

1) days09 폴더 안에 아래 파일과 폴더 생성
          ㄴ ex03.jsp
          ㄴ admin 폴더 : admin 관리자로 로그인을 해야지만 사용할 수 있는 폴더
                 -> 인증 + 권한 필요


ㄴ board 폴더 : 반드시 로그인을 해야만 사용할 수 있다. (member 세션 값으로 로그인 정보가 들어가있음, 인증 처리는 세션을 사용)
           ㄴ ex03_list.jsp - 글 목록 페이지 -> h3태그로 파일명만 있음
           ㄴ ex03_write.jsp - 글 쓰기 페이지 -> h3태그로 파일명만 있음


ㄴ member 폴더
          ㄴ ex03_logon.jsp
          ㄴ ex03_logout.jsp
          ㄴ ex03_logon_ok.jsp

 

2) 필터 추가
com.filter.LoginCheckFilter.java 필터 클래스 생성
필터 등록하는 작업을 @WebFilter 어노테이션 사용

문제점) ex03.jsp에서 글쓰기 클릭
-> LoginCheckFilter 거쳐서 로그인 X
-> ex03_logon.jsp 리다이렉트
-> id/passwd 로그인 성공

무조건 메인페이지로 이동 X -> 원래 요청URL 이동
-> 지금은 메인페이지로 리다이렉트
-> 글쓰기 페이지로 리다이렉트로 처리 *****

 

[LoginCheckFilter.java - 필터 클래스]

 

[ex03.jsp]

 

[ex03_logon.jsp]


[ex03_logon_ok.jsp]


[ex03_logout.jsp]

 

> 로그인 했을 경우

 

> 로그인 전 글목록을 누르면 로그인 화면이 보이고 로그인 성공시 ex03_list.jsp가 보여짐

 

728x90
반응형