CharacterEncodingFilter の設定調査

CharacterEncodingFilter は、リクエストやレスポンスの文字エンコーディングを設定するためのフィルターです。これにより、リクエストパラメータやレスポンスボディが適切なエンコーディングで処理されるようになります。

通常、CharacterEncodingFilter の設定は web.xml で行います。ただし、特定の URL に対して異なるエンコーディングを設定したい場合には、web.xml の <filter-mapping> 要素を活用してフィルターを適用する URL パターンを指定できます。

以下は、web.xml で CharacterEncodingFilter を設定する例です。

```xml
<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 に分岐する設定

```xml
<!-- 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>
```

#### <url-pattern> 要素を複数設定する必要がある場合

```xml
<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>
```

#### フィルター内で条件分岐

```java
@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 を使用した方法

```java
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;
    }
}
```