세미프로젝트

Servlet Filter 적용

Dodledd 2024. 4. 16. 15:18

우선 Servlet Filter란?

말그대로 Servlet에서 지원하는 filter이다.

 

우리가 서블렛에서 사용했던 HTTPServletRequest가 ServletRequest의 자식이다.

filter는 ServletRequest에 속해있다.

 

그럼 필터는 무슨 역할을 할까?

서블릿이 호출되기전에 잠깐 요청을 가로채서 기능을 수행시킬 수 있는데 그 중 유용한 것들을 뽑아보면

  • 로그인 시 사용자 인증 필터
  • POST로 보낼 시 UTF-8 인코딩 해주기
  • 암호화
  • 이미지 변환, 데이터 압축 등

공통적으로 수행하는 기능을 클래스에 매번 작성할 필요없이 filter하나 만들어놓으면 간단하게 해결 할 수있다.

심지어 사용법도 간단하다.

 

먼저 우리는 어노테이션으로 servlet 주소를 매핑해준다

@WebFilter("/*")

이것을 절대경로*로 하여 모든 servlet이 거쳐가게 해준다.

이렇게 하면 모든 servlet이 거쳐서 동일한 기능을 수행시킬 수 있다.

 

public void destroy() {
    //필터가 종료할 때 해줄 작업
}

destroy()는 필터가 종료될 때 해줄 작업을 적는 곳이다.

 

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //요청을 가로채거나

    //특정 조건ㅇ 따라서 다른 필터나 서블릿으로 요청을 전달
    request.setCharacterEncoding("UTF-8");

    chain.doFilter(request, response);
}

doFilter()는 필터가 해줄 역할(기능)을 적어주면 된다.

위는 POST로 받은 Encoding을 UTF-8로 변환시켜준다.

chain은 문제가 없을 시 다음 서블렛으로 넘어가도 된다는 허락 같은 느낌이다.

 

다른 예로 로그인 필터를 보면

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("로그인 필터 통과");

    HttpServletRequest httpRequest = (HttpServletRequest)request;
    HttpServletResponse httpResponse = (HttpServletResponse)response;
    if(httpRequest.getSession().getAttribute("loginUser") == null) {
        httpResponse.sendRedirect(httpRequest.getContextPath());
    } else {
        chain.doFilter(request, response);
    }
}

HTTPServletRequest는 ServletRequest의 자식임을 기억하자.

Filter는 ServletRequest에 속해있으니 그 자식의 기능인 request나 response를 사용하려면 다운캐스팅을 해줘야한다

if문 안에는 Session에 loginUser가 null이면 다시 홈페이지로 보내버리고 null이 아닐 때만 다음 servlet으로 넘어가는 기능이다.

 

이것도 세미에 적용해봐야겠다