LoginSignup
1
1

More than 5 years have passed since last update.

Spring Boot を使って特定のリクエストだけ文字エンコードを変更する

Last updated at Posted at 2018-09-25

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;

        }
    }
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1