아래의 필터 클래스를 살펴보자.
package com.archnal.securityweb.web;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
// import 생략
@Service("restfulAuthFilter")
public class RestfulAuthFilter implements Filter {
@Resource(name="statusMessageBuilder")
StatusMessageBuilder messageBuilder;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
.. 생략
String message = messageBuilder.getErrorMessage("AUTH_ERROR");
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
doFilter 메서드 안에서 DI 된 messageBuilder를 사용하고 있다.
스프링 DI를 사용하지 않는 일반 필터처럼 web.xml 파일에 아래와 같이 지정하면 messageBuilder.getErrorMessage("AUTH_ERROR")를 실행할 때 NullPointerException 이 발생한다.
스프링 어플리케이션 컨텍스트에 의해서 DI가 실행되지 않았기 때문에 여전히 messageBuilder가 null이기 때문이다.
<filter>
<filter-name>restfulAuthFilter</filter-name>
<filter-class>
com.archnal.securityweb.web.RestfulAuthFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>restfulAuthFilter</filter-name>
<url-pattern>/ws/rest/secure/*</url-pattern>
</filter-mapping>
이런 경우 스프링컨텍스트의 DI를 이용해서 필터를 구현하고자 하는 경우에는 아래와 같이 web.xml 파일을 설정해야 한다.
<filter>
<filter-name>restfulAuthFilter</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>restfulAuthFilter</filter-name>
<url-pattern>/ws/rest/secure/*</url-pattern>
</filter-mapping>
주의해야 할 점은 filter-name과 필터 클래스의 빈 이름이 동일해야 한다.
위의 필터의 타입레벨 annotation으로 @Service("restfulAuthFilter") 설정된 restfulAuthFilter가 filter-name으로 사용되어야 한다.
위와 같이 web.xml 파일을 설정하면 스프링의 DI를 이용하여 필터를 작성할 수 있다.
댓글 없음:
댓글 쓰기