Servlet Filter 적용
우선 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으로 넘어가는 기능이다.
이것도 세미에 적용해봐야겠다