앎/web

[Servlet] 서블릿 필터(Servlet Filter)

후니아부지 2014. 3. 13. 15:19

서블릿 필터

웹 상에서 사용자 요청 페이지가 실행하기 전이나 후에 동작이나 데이터를 가로채서 어떠한 작업을 해주고 해당 페이지로 넘어갈 수 있도록, 혹은 넘어갈 수 없도록 막는 등의 작업을 할 때 사용한다.

예를 들면 이벤트나 공지 등의 팝업을 추가하거나 전달 받은 데이터를 인코딩하는 경우, 세션 데이터를 인증하는 등의 작업에 사용될 수 있다.


Filter 인터페이스를 구현하는 클래스 작성 후

class 클래스명 implements Filter {
    public void init(FilterConfig fc) throws ServletExeption {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
              throws IOEXception, ServletException {
        // 필터 작업
        
        chain.doFilter(request, response); // '가던 길로 가세요~' 라는 의미 :)
    }

    public void destroy() {
    }
}

web.xml에 등록하여 사용한다. (서블릿 보다 위에 작성한다.)

<filter>
  <filter-name>필터명</filter-name>
  <filter-class>필터클래스</filter-class>
  <init-param>
    <param-name>매개변수명</param-name>
    <param-value>값</param-value>
  </init-param> 
</filter>

<filter-mapping>
  <filter-name>필터명</filter-name>
  <url-pattern>필터패턴</url-pattern>
</filter-mapping>


예제) 로그인 페이지에서 로그인 후 메인 페이지로 이동

login.htm


LoginProcessServlet.java

 

web.xml


MainServlet.java


이때 문제가 되는 것이, 로그인 후 메인 페이지의 주소를 복사한 후 서버 재시작 후 복사한 주소를 넣고 이동하면 메인 페이지로 바로 갈 수 있다. 로그인 과정을 거치지도 않았는데도 메인 페이지를 볼 수 있다는 것이다.

이를 방지하기 위해 필터를 사용해본다.

 

Filter 클래스를 생성하고 web.xml에 등록해준다.

 

web.xml

<servlet> 태그 보다 위에 작성해야 한다. '.do'로 서블릿을 호출할 때 LoginFilter 필터가 적용되도록 설정한다. 

 

LoginFilter.java

세션에 ID가 있는지 확인해서 없다면 로그인 화면으로 가도록 한다.

LoginProcessServlet 에서 세션에 ID를 저장하도록 할 것이므로 필터 처리에 예외가 되도록 한다. LoginProcessServlet 를 거치지 않고서는 ID가 세션에 없으므로 무조건 로그인 화면으로 가버리게 되기 때문이다.

 

LoginProcessServlet.java

로그인 처리 서블릿에서는 세션에 ID를 저장하고 Main.do를 호출한다.


 

MainServlet.java



로그인 후 세션이 생성되었을 때의 주소를 복사 후, 서버를 재시작하고 앞에 복사한 주소로 직접 접근해본다.

이제는 Main.do 로 접근 시 필터에 걸려서 (세션에 ID가 없으므로) 로그인 화면으로 이동될 것이다.