클라이언트로부터 요청이 백엔드로 가기 전에 가로채기 위해서와,
서버로부터의 응답이 클라이언트로 보내지기 전에 조작하기 위해서 사용한다.
프로젝트안에 java 폴더안에 서블릿을 위한 패키지가 생성되어있다.
이 패키지 안에 Filter 클래스를 담을 패키지를 만들어 준다.
이름만 봐도 기능을 알 수 있도록, 이름을 지어준다. Filter 패키지를 생성한 후, class 파일을 생성했다.
인터페이스 Filter를 implements 하고 doFilter 메소드를 오버라이드 해준다.
@WebFilter()
어노테이션으로 파일을 연결 해 준다.
@WebFilter("/regit")
이렇게 파일마다 만들어야 한다면 복잡할 것이다.
그래서 @WebFilter("/*")
로 적어주면 모든 파일에 적용할 수 있다.
하지만 이렇게 하면 CSS와 충동일 발생할 수 있다.
Hello Filter! 라는 문장을 출력하도록 실행시켜보면, 사이트 화면에는 아무것도 출력이 되지 않고, console창에만 문구가 출력이 된다.
이것은 filter 가 요청은 되었지만 넘겨지지 않고 Hold 하고있는 상태라는 것을 의미한다. 다음 작업으로 진행하려면 세번째 파라미터인 arg2로
arg2.doFilter(arg0, arg1);
을 해줘야 한다.
요청이 넘어갔는지 확인하기 위한 문구를 출력하고 doFilter를 넣어주면
화면에 정상적으로 넘어가는 것을 볼 수 있다.
rag.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="regit" method="post"> <div> <label>제목 : </label> <input type="text" name="title"> </div> <div> <label>내용 : </label> <textarea name="content"></textarea> </div> <div> <input type="submit" value="출력"> </div> </form> </body> </html>
CharacterEncodingFilter.java
package com.koit.web.servlet.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; @WebFilter("/*") public class CharacterEncodingFilter implements Filter{ @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { arg0.setCharacterEncoding("utf-8"); arg1.setCharacterEncoding("utf-8"); arg1.setContentType("text/html; charset=utf-8"); arg2.doFilter(arg0, arg1);