CharacterEncodingFilter は、リクエストやレスポンスの文字エンコーディングを設定するためのフィルターです。これにより、リクエストパラメータやレスポンスボディが適切なエンコーディングで処理されるようになります。
通常、CharacterEncodingFilter の設定は web.xml で行います。ただし、特定の URL に対して異なるエンコーディングを設定したい場合には、web.xml の 要素を活用してフィルターを適用する URL パターンを指定できます。
以下は、web.xml で CharacterEncodingFilter を設定する例です。
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
特定の URL に分岐する設定
<!-- UTF-8 エンコーディングを適用するフィルター -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/utf8/*</url-pattern>
</filter-mapping>
<!-- Shift_JIS エンコーディングを適用するフィルター -->
<filter>
<filter-name>sjisEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sjisEncodingFilter</filter-name>
<url-pattern>/sjis/*</url-pattern>
</filter-mapping>
要素を複数設定する必要がある場合
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- /api/* に適用 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/api/*</url-pattern>
</filter-mapping>
<!-- /user/* に適用 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
<!-- /admin/* に適用 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
フィルター内で条件分岐
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String path = httpRequest.getRequestURI();
// 特定のパスに対してフィルターを無効にする
if (!path.startsWith("/exclude")) {
if (forceEncoding || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
}
}
chain.doFilter(request, response);
}
JavaConfig を使用した方法
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}