欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年02月07日 16:07:30   作者:漫夭  
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下

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

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

背景:

使用Spring RestTemplate,配置如下:

  <bean id="restTemplate" 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中,F(xiàn)astJsonHttpMessageConverter初始化時,設置了MediaType。

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

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

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

后續(xù)在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());
  }

所以,需要為ViewAwareJsonMessageConverter設置supportedMediaTypes:

<bean class="cn.com.autodx.common.jsonView.ViewAwareJsonMessageConverter">
  <property name="supportedMediaTypes">
    <list>
      <value>application/json;charset=UTF-8</value>
      <value>application/*+json;charset=UTF-8</value>
    </list>
  </property>
</bean>

新版本序列化默認不再對字段進行排序

這個是一個簽名算法的場景:客戶端對參數(shù)進行序列化,然后md5加密成一個簽名;服務端按照相同的算法解析一遍參數(shù),對比簽名值。這里加密依賴json序列化之后的字符串,也就依賴序列化時字段的排序。

這是fastjson做了一個性能優(yōu)化,將排序需求抽象出一個SerializerFeature,供用戶自己配置。如果需要排序場景,在序列化時添加參數(shù)SerializerFeature.MapSortField即可,即:

JSON.toJSONString(obj, SerializerFeature.MapSortField);

官方文檔

1.2.3之后的版本,Map的序列化沒有做排序再輸出,原因是通過TreeMap排序很影響性能。

1.2.27版本中增加SerializerFeature.MapSortField實現(xiàn)同樣的功能。

使用方法如下:

a) 傳入SerializerFeature.MapSortField參數(shù)。 JSON.toJSONString(map, SerializerFeature.MapSortField);

b) 通過代碼修改全局缺省配置。 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.MapSortField.getMask();

c) 通過JVM啟動參數(shù)配置修改全局配置 -Dfastjson.serializerFeatures.MapSortField=true

d) 通過類路徑下的fastjson.properties來配置 fastjson.serializerFeatures.MapSortField=true

新老版本序列化和反序列化不兼容,會出亂碼。

更多關(guān)于fastjson的相關(guān)文章請點擊下面的相關(guān)鏈接

相關(guān)文章

  • 詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔

    詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔

    這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • java實現(xiàn)隊列queue數(shù)據(jù)結(jié)構(gòu)詳解

    java實現(xiàn)隊列queue數(shù)據(jù)結(jié)構(gòu)詳解

    大家好,本篇文章主要講的是java實現(xiàn)隊列queue數(shù)據(jù)結(jié)構(gòu)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • springboot實現(xiàn)用戶名查找用戶功能

    springboot實現(xiàn)用戶名查找用戶功能

    本文主要介紹了springboot實現(xiàn)用戶名查找用戶功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • SpringBoot找不到映射文件的處理方式

    SpringBoot找不到映射文件的處理方式

    這篇文章主要介紹了SpringBoot找不到映射文件的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java8如何從一個list中獲取某一元素集合

    Java8如何從一個list中獲取某一元素集合

    這篇文章主要介紹了Java8如何從一個list中獲取某一元素集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    下面小編就為大家?guī)硪黄钊肫饰鰳?gòu)建JSON字符串的三種方式(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java單例模式的線程安全,餓漢和懶漢模式詳解

    Java單例模式的線程安全,餓漢和懶漢模式詳解

    這篇文章主要為大家詳細介紹了Java單例模式的線程安全,餓漢和懶漢模式。文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • SpringBoot獲取配置文件的簡單實現(xiàn)方法

    SpringBoot獲取配置文件的簡單實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取配置文件的簡單實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05
  • JAVA獲得域名IP地址的方法

    JAVA獲得域名IP地址的方法

    這篇文章主要介紹了JAVA獲得域名IP地址的方法,涉及java域名操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • mybatis-4 mybatis與spring結(jié)合使用及原理解析

    mybatis-4 mybatis與spring結(jié)合使用及原理解析

    本文通過圖文并茂的形式給大家介紹了mybatis-4 mybatis與spring結(jié)合使用及原理解析,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04

最新評論