본문 바로가기

개발/Java

[JAVA - WEB] 서블릿 필터(Filter)

728x90
반응형
서블릿 속성과 스코프(scope)

 

속성은 앞에서 보았듯이 서블릿 API 의 setAttribute 로 바인딩하고 getAttribute 로 바인딩 된 속성을 가져와서 사용합니다.

그리고 속성을 제거할때는 removeAttribute 를 이용해 제거할 수도 있습니다.

 

서블릿 스코프는 서블릿 API 에 바인딩 된 속성에 대한 접근 범위를 의미합니다.

 

스코프 종류 서블릿 API 스코프 설명
애플리케이션 스코프 ServletContext 애플리케이션 전체에 대해 접근할 수 있습니다.
세션 스코프 HttpSession 브라우저에서만 접근할 수 있습니다.
리퀘스트 스코프 HttpServletRequest 해당 요청/응답 사이클에서만 접근할 수 있습니다.

 

// setAttribute
...
String ctxMesg = "context binding";
String sesMesg = "session binding";
String reqMesg = "request binding";

ServletContext ctx = getServletContext();
HttpSession session = request.getSession();
ctx.setAttribute("context", ctxMesg);
session.setAttribute("session", sesMesg);
request.setAttribute("request", reqMesg);
...



// getAttribute
...
ServletContext ctx = getServletContext();
HttpSession sess = request.getSession();

String ctxMesg = (String) ctx.getAttribute("context");
String sesMesg = (String) sess.getAttribute("session");
String reqMesg = (String) request.getAttribute("request");
...

 

웹 브라우저에 set 을 먼저 요청한 후 get 을 요청합니다.

 

request 는 요청한 request 와 생성된 request 객체가 다르므로 바인딩된 값이 없으므로 null 을 출력합니다.

explorer 브라우저로 get 을 요청하면 세션 객체도 바인딩 된 값이 없게 되므로 null 을 표시하게 되겠죠?

 

역시나 브라우저가 달라서 null 을 출력하는 군요.

 

 

 

서블릿의 URL 패턴

 

URL 패턴이란 실제 서블릿의 매핑 이름을 말합니다. 
서블릿 매핑 시 사용되는 가상의 이름으로 클라이언트가 브라우저에서 요청할 때 사용되면 반드시 슬래시(/)로 시작합니다.
서블릿 매핑 이름으로 사용되는 URL 패턴으 종류는 정확히 이름까지 일치하는지, 디렉터리까지만 일치하는지, 확장자만 일치하는지 등에 따라 나뉩니다.

- 모두 일치 : @WebServlet("/first/test")
- 디렉터리까지 일치 : @WebServlet("/first/*")
- 확장자만 일치 : @WebServlet("*.do") (확장자명은 지정하지 않을 수 있고 원하는 다른 이름으로도 사용이 가능)
- 모든 요청 : @WebServlet("/*")

각 패턴에 따라서 요청할 수 있는 URL 로 각각에 맞춰서 지정할 수 있게 됩니다.

 

 

 

Filter API

 

필터란 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답과 관련해 여러가지 작업을 처리하는 기능입니다.
각 서블릿에서 반복적으로 처리해야 하는 작업이 있을 경우 이러한 공통 작업을 미리 필터에서 처리하면 반복해서 작업할 필요가 없어지는거죠.

 

요청 필터 사용자 인증 및 권한 검사
요청 시 요청 관련 로그 작업
인코딩 기능
응답 필터 응답 결과에 대한 암호화 작업
서비스 시간 측정
필터 관련 API javax.servlet.Filter
javax.servlet.FilterChain
javax.servlet.FilterConfig

 

Filter 인터페이스 메서드

 

메서드 기능
init() 필터 생성 시 컨테이너에 의해 호출되어 초기화 작업을 수행합니다.
doFilter() 요청/응답 시 컨테이너에 의해 호출되어 기능을 수행합니다.
destroy() 필터 소멸 시 컨테이너에 의해 호출되어 종료 작업을 수행합니다.

 

 

FilterConfig 메서드

 

메서드 기능
getFilterName() 필터 이름을 반환합니다.
getInitParameter(String name) 매개변수 name 에 대한 값을 반환합니다.
getServletContext() 서블릿 컨텍스트 객체를 반환합니다.

 

 

 

필터를 이용한 한글 인코딩

 

사용자 정의 필터는 반드시 Filter 인터페이스를 구현해야 합니다. 
그리고 init(), doFilter(), destory() 추성 메서드를 구현해야 합니다. 
사용자 정의 필터를 생성하면 필터를 각각의 요청에 맞게 적용하기 위해 필터 매핑을 해줘야 합니다.(할게 많네요..)

 

필터를 삽입할 패키지를 선택하고 New - Filter 를 선택합니다.

 

 

Class name 을 입력하고 Next 를 클릭합니다.

 

 

Filter mappings 의 Edit 를 클릭합니다.

 

 

모든 요청에 대해 필터 기능을 수행하도록 Pattern 에 /* 로 넣고 OK 를 클릭합니다.

 

 

/* 를 확인한 후 Next 를 클릭합니다.

 

 

Finish 를 클릭하여 필터 클래스가 생성된 것을 확인합니다.

 

 

필터 클래스가 생성 되었습니다.

 

 

doFilter 함수 내부에 chain.doFilter(request, response) 의 윗부분에 아래의 코드를 삽입하면 모든 요청에 대해 한글 인코딩이 수행됩니다.

request.setCharacterEncoding("utf-8");

 

참고로 필터에서 doFilter() 메서드를 기준으로 위쪽에 위치하는 코드는 요청 필터 기능을 수행하고 아래에 위치한 코드는 응답 필터 기능을 수행합니다.
서블릿이나 JSP 에서 공통으로 처리해야 할 작업을 필터에 구현해놓고 사용하면 편리하겠죠?

 

 

여기까지 임미다.

728x90