[JSP] Filter

Beom J·2021년 6월 29일
0

Java

목록 보기
5/8

Filter 란?

전처리를 사용해서 보통 한글 처리 부분이나 로그인 부분에 쓰임.
이름 그대로 한번 걸러주는 역할.

form 실행 할 때 get 방식으로 넘겨준 한글은 안깨지만, post 방식은 따로 request.setCharactorEncoding() 을 해서 넘겨줘야 한다.
(그게 jsp 페이지당이든 model 에서 넘겨줄때든.)

근데 이걸 매번 설정해주기 번거로우니까
filter 에서 한번 인코딩 먹여준 후 넘기는 방식이 자주 쓰인다고 했다.

주요 메서드

  1. init()
    생성과 관련된 메서드. 톰캣이 실행될때 호출된다.

  2. destroy()
    소멸과 관련된 메서드. 톰캣이 종료될때 호출된다.

  3. doFilter()
    전처리 / 후처리와 관련된 메서드. jsp 파일이 읽힐때 호출된다.

Filter 적용 방법

Filter 를 사용할 때는 web.xml 파일 설정을 해주는 방법과, @annotation 으로 사용하는 법 2가지가 있다.

1. web.xml 파일에 filter 설정

 <filter>
  	<filter-name>필터 이름</filter-name>
  	<!-- 필터 클래스 -->
  	<filter-class>패키지명.클래스명</filter-class>
  	<!-- init 에 parameter 를 설정해 줄 수 있음 -->
  	<init-param>
  		<param-name>data</param-name>
  		<param-value>데이터</param-value>
  	</init-param>
  </filter>
  
  <filter-mapping>
  <!-- 필터를 적용할 페이지 설정 -->
  	<filter-name>필터 이름</filter-name>
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  
  <!-- 필터 선언 순서에 따라 필터 실행 순서도 달라짐 -->
  <filter>
  	<filter-name>SecondFilter</filter-name>
  	<filter-class>filter.FilterEx02</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>SecondFilter</filter-name>
  	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>

2. @WebFilter 로 설정 방법

@annotation 은 class 상단에 @WebFilter(사용할 페이지명) 을 붙여준다.

// @WebFilter("*.jsp") // 기본 annotation
@WebFilter( // parameter 설정해줄 때
	urlPatterns = { "*.jsp" }, // 필터 먹일 url 
	initParams = { 
    		@WebInitParam(name = "data", value = "데이터", description = "초기 데이터")
            })
public class FilterEx01 implements Filter {
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		// 생성과 관련된 메소드
		
		System.out.println("새로운 필터");
		System.out.println("data : "+fConfig.getInitParameter("data"));
        // 톰캣 실행시 "data : 데이터" 가 출력 됨
	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		// 소멸과 관련된 메서드 
		
		System.out.println(" 첫번째 destroy() 호출");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		
		// 전처리 구간
		System.out.println("첫번째 전처리");
		arg2.doFilter(arg0, arg1);
		// 후처리 구간
		System.out.println("첫번째 후처리");
	}

}

!!!! 주의 사항 !!!!

@WebFilter 로 filter 를 실행할 때, filter class 가 여러개라면
경우에 따라 filter 의 실행 순서 가 중요할 때가 있다!

이번의 경우에는 filter 패키지에

  1. EncodingFilter : jsp 에 utf-8 인코딩 설정
  2. InputFilter : 파라미터 값 null 일 경우 error 페이지로 이동

이렇게 두가지 필터를 각각 class 로 만들어 주는 예습을 했다.

문제는! annotation 으로 설정한 필터의 경우
web.xml 에서 처럼 명시적으로 필터 적용 순서를 지정해주지 않았더니
input 필터가 먼저 실행되고 encoding 필터가 실행되서 한글이 자꾸 깨지는거 ㅠㅠㅠ

해결 방법은

  1. EncodingFilter implements Filter
    : doFilter() 에 setCharacterEncoding()
  2. InputFilter extends EncodingFilter
    : doFilter() 에 super.doFilter() 를 넣어서 InputFilter 실행 전에 인코딩 먼저 먹여주기!!!!

와 이거 쌤이 말했는데 내가 흘려들은건지 나만 그런건지 몰라도
암만 이것저것 건드려보고 sysout 찍어봐도 모르겠어서 한참 헤맸다.

그래도 해결하니까 속이 스원하군요.........

잊지말자 실행순서!!!!!!!!!!
잊지말자 this() 와 super() 의 존재!!!!!!!!!!!

profile
네..? 개발자요...? 아....직 일걸요...?

0개의 댓글