spring 프로젝트에서 web.xml에 아래와 같이 필터를 적용했다.
파일 업로드를 위해 multipartFilter가 필요했고 보안을 위해 xssFilter가 필요했다.
<filter>
<filter-name>multipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>multipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Encoding filter -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- XSS filter -->
<filter>
<filter-name>XSS</filter-name>
<filter-class>egovframework.template.common.utils.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>xssEscapeServletFilter</filter-name>
<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssEscapeServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
다양한 필터 설정 시 위치도 영향을 미치게 되는데,
1. multipart도 xssFilter를 타기 위해 보다 상단에 위치해야 한다.
2. xssEscapeServletFilter는 CharacterEncodingFilter 뒤에 위치해야 한다.
이 순서를 지켜서 돌려봤더니 xssFilter는 적용되는데 서버에서 파일을 받아오지 못했다.
확인해보니 multipart로 전송되는 파일 스트림은 한번만 사용할 수 있는데 필터에서 사용해버리기 때문에 컨트롤러에서는 사용할 수 없게 된다.
해결방법은
1. multipartFilter에 초기값으로 설정한 multipartResolverBeanName을 삭제한다.
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>multipartResolver</param-value>
</init-param>
2. multipartResolver bean 등록 시 bean id를 filterMultipartResolver로 수정한다.
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="100000000" />
</bean>