Spring Boot を利用して、WebAPIをつくった際の覚書。
特定のシステムから呼び出されるリクエストのみ「Shift-JIS」で呼ばれるためデフォルトの文字エンコード(UTF-8)だと文字化けしてしまいます。
かといって他のシステムからの呼び出しは、「UTF-8」なんで一部のURLのみエンコードする文字列を変更する必要があります。
@Configurationをつけたクラスに以下の記述を追加するだけ。
public static class EncodingFilterConfig {
// ここで指定されたURLを含むリクエストの場合、文字エンコードを変更します。
private static final String TARGET_URL = "<targetURL>";
@Autowired
private HttpEncodingProperties properties;
/**
* Shift_JIS用のフィルターを追加
*
* @return FilterRegistrationBean<OrderedCharacterEncodingFilter>
*/
@Bean
public FilterRegistrationBean<OrderedCharacterEncodingFilter> sjisCharacterEncodingFilter() {
OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter() {
@Override
protected String getAlreadyFilteredAttributeName() {
return OrderedCharacterEncodingFilter.class.getName() + ALREADY_FILTERED_SUFFIX;
}
};
filter.setEncoding("Shift_JIS");
filter.setForceRequestEncoding(properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(properties.shouldForce(Type.RESPONSE));
FilterRegistrationBean<OrderedCharacterEncodingFilter> bean = new FilterRegistrationBean<OrderedCharacterEncodingFilter>(
filter);
bean.addUrlPatterns(TARGET_URL);
bean.setOrder(Integer.MIN_VALUE);
return bean;
}
/**
* デフォルトの文字コードエンコードフィルタを上書き
*
* @return CharacterEncodingFilter
*/
@Bean
public CharacterEncodingFilter characterEncodingFilter() {
OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter() {
private AntPathRequestMatcher matcher = new AntPathRequestMatcher(TARGET_URL);
@Override
protected String getAlreadyFilteredAttributeName() {
return OrderedCharacterEncodingFilter.class.getName() + ALREADY_FILTERED_SUFFIX;
}
};
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(properties.shouldForce(Type.RESPONSE));
filter.setOrder(Integer.MIN_VALUE+1);
return filter;
}
}