當前位置 主頁 > 網站技術 > 代碼類 > 最大化 縮小

    解決fastjson從1.1.41升級到1.2.28后報錯問題詳解

    欄目:代碼類 時間:2020-02-07 18:05

    最近因為fastjson安全漏洞,升級jar包時,踩了一些坑。

    新版本FastJsonHttpMessageConverter初始化,默認設置MediaType為*/*

    背景:

    使用Spring RestTemplate,配置如下:

      <bean  class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="ky.clientHttpRequestFactory"/>
        <property name="errorHandler">
          <bean class="org.springframework.web.client.DefaultResponseErrorHandler"/>
        </property>
        <property name="messageConverters">
          <list>
            <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
            <bean class="cn.com.autodx.common.jsonView.ViewAwareJsonMessageConverter">
            </bean>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
              <property name="supportedMediaTypes">
                <list>
                  <value>text/html;charset=UTF-8</value>
                  <value>application/json</value>
                  <value>text/javascript;charset=utf-8</value>
                </list>
              </property>
            </bean>
          </list>
        </property>
      </bean>

    其中ViewAwareJsonMessageConverter繼承自FastJsonHttpMessageConverter。

    fastjson從1.1.41升級到1.2.28之后,請求報錯:

    json java.lang.IllegalArgumentException: 'Content-Type' cannot contain wildcard type '*'

    原因是在1.1.41中,FastJsonHttpMessageConverter初始化時,設置了MediaType。

      public FastJsonHttpMessageConverter(){
        super(new MediaType("application", "json", UTF8), new MediaType("application", "*+json", UTF8));
      }

    而在1.2.28中,設置的MediaType為‘/',即:

      public FastJsonHttpMessageConverter() {
        super(MediaType.ALL); // */*
      }

    后續在org.springframework.http.converter.AbstractHttpMessageConverter.write過程中,又要判斷Content-Type不能含有通配符,這應該是一種保護機制,并強制用戶自己配置MediaType。代碼如下:

      @Override
      public final void write(final T t, MediaType contentType, HttpOutputMessage outputMessage)
          throws IOException, HttpMessageNotWritableException {
        final HttpHeaders headers = outputMessage.getHeaders();
        if (headers.getContentType() == null) {
          MediaType contentTypeToUse = contentType;
          if (contentType == null || contentType.isWildcardType() || contentType.isWildcardSubtype()) {
            contentTypeToUse = getDefaultContentType(t);
          }
          if (contentTypeToUse != null) {
          //設置Content-Type,不允許含有通配符
            headers.setContentType(contentTypeToUse);
          }
        }
        ......
        if (outputMessage instanceof StreamingHttpOutputMessage) {
          ......
        }else {
        //自定義MessageConverter的write操作
          writeInternal(t, outputMessage);
          outputMessage.getBody().flush();
        }
      }
      public void setContentType(MediaType mediaType) {
        Assert.isTrue(!mediaType.isWildcardType(), "'Content-Type' cannot contain wildcard type '*'");
        Assert.isTrue(!mediaType.isWildcardSubtype(), "'Content-Type' cannot contain wildcard subtype '*'");
        set(CONTENT_TYPE, mediaType.toString());
      }
    
    下一篇:沒有了
777亚洲人成视频免费视频