国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

dubbo 2.5.3對于java.sql的反序列化BUG

劉玉平 / 1690人閱讀

摘要:使用的序列化是的,而對于類的反序列化的源碼如下這里我們可以清楚地看出來,將讀取到的轉(zhuǎn)為然后調(diào)用了方法,那么如果我們的屬性為空,那么調(diào)用函數(shù)必然會拋異常,也就產(chǎn)生了之后的結(jié)果。補(bǔ)充說明我找到的源碼可以看出,對于,,的反序列化均有問題存在。

背景

這是我之前提的問題:問題鏈接

在使用dubbo 2.5.3的時候,定義的接口中有一個方法使用了實體類作為參數(shù),而這個實體類中定義了一個變量為java.sql.Time類型。不妨?xí)呵叶x接口如下:

//BusinessDto中有一個屬性dealTime 為java.sql.Time類型
String queryBusiness(BusinessDto param);

當(dāng)消費者調(diào)用這個接口的時候,如果param中的dealTime為null,那么在提供者那里接收到的整個param都為null,如果這個屬性不為null,那么參數(shù)可以正常的傳遞。

問題原因解析

問題出在反序列化的時候。
dubbo使用的序列化是hession2的,而hession2對于Time類的反序列化的源碼如下:

    static class SqlTimeFieldDeserializer extends FieldDeserializer {
    private final Field _field;
    SqlTimeFieldDeserializer(Field field)
    {
      _field = field;
    }
    
    void deserialize(AbstractHessianInput in, Object obj)
      throws IOException
    {
      java.sql.Time value = null;
      try {
        java.util.Date date = (java.util.Date) in.readObject();
        value = new java.sql.Time(date.getTime());
        _field.set(obj, value);
      } catch (Exception e) {
        logDeserializeError(_field, obj, value, e);
      }
    }
  }

這里我們可以清楚地看出來,將in讀取到的object轉(zhuǎn)為Date然后調(diào)用了getTime方法,那么如果我們的dealTime屬性為空,那么調(diào)用getTime函數(shù)必然會拋異常,也就產(chǎn)生了之后的結(jié)果。

補(bǔ)充說明

我找到的源碼可以看出,對于 java.sql.Date, java.sql.Timestamp, java.sql.Time的反序列化均有問題存在。

  static class SqlDateFieldDeserializer extends FieldDeserializer {
    private final Field _field;
    SqlDateFieldDeserializer(Field field)
    {
      _field = field;
    }
    
    void deserialize(AbstractHessianInput in, Object obj)
      throws IOException
    {
      java.sql.Date value = null;
      try {
        java.util.Date date = (java.util.Date) in.readObject();
        value = new java.sql.Date(date.getTime());
        _field.set(obj, value);
      } catch (Exception e) {
        logDeserializeError(_field, obj, value, e);
      }
    }
  }
  static class SqlTimestampFieldDeserializer extends FieldDeserializer {
    private final Field _field;
    SqlTimestampFieldDeserializer(Field field)
    {
      _field = field;
    }
    
    void deserialize(AbstractHessianInput in, Object obj)
      throws IOException
    {
      java.sql.Timestamp value = null;
      try {
        java.util.Date date = (java.util.Date) in.readObject();
        value = new java.sql.Timestamp(date.getTime());
        _field.set(obj, value);
      } catch (Exception e) {
        logDeserializeError(_field, obj, value, e);
      }
    }
  }
  static class SqlTimeFieldDeserializer extends FieldDeserializer {
    private final Field _field;
    SqlTimeFieldDeserializer(Field field)
    {
      _field = field;
    }
    
    void deserialize(AbstractHessianInput in, Object obj)
      throws IOException
    {
      java.sql.Time value = null;
      try {
        java.util.Date date = (java.util.Date) in.readObject();
        value = new java.sql.Time(date.getTime());
        _field.set(obj, value);
      } catch (Exception e) {
        logDeserializeError(_field, obj, value, e);
      }
    }
  }

而hessian4 則修復(fù)了這個問題,在調(diào)用getTime之前做了非空判斷,如果為空則把這個屬性賦null而不是產(chǎn)生異常。

如果已經(jīng)開始大規(guī)模的使用那么不妨使用別的類型,繞過這三個類型即可避免這個問題。

總結(jié)

問題來源于同事隨口問的一個小問題,挺感興趣就一直糾纏了下來,發(fā)現(xiàn)問題還是挺嚴(yán)重的,另外借用同事的一句話,不再維護(hù)的開源軟件真的挺危險。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70074.html

相關(guān)文章

  • 了解dubbo列化bug開始

    摘要:就是默認(rèn)的序列化器和反序列化器。最后,那為什么會到這一步呢發(fā)現(xiàn)拿到反序列化器后會執(zhí)行一個操作基本上就到這里了,最主要的原因還是方法,并不是很多博文說的。 ????首先交代背景,前幾天遇到一個小bug,由于其他系統(tǒng)的一個DTO子類和父類有一個字段名重復(fù)了,所以導(dǎo)致我set的子類字段那邊拿不到值。改起來很簡單嘛,讓對面把子類的字段刪掉就好,但是拿不到值的原因讓我想了很久,很明顯是序列化和反...

    lemanli 評論0 收藏0
  • dubbo源碼解析(四十三)2.7新特性

    摘要:大揭秘目標(biāo)了解的新特性,以及版本升級的引導(dǎo)。四元數(shù)據(jù)改造我們知道以前的版本只有注冊中心,注冊中心的有數(shù)十個的鍵值對,包含了一個服務(wù)所有的元數(shù)據(jù)。 DUBBO——2.7大揭秘 目標(biāo):了解2.7的新特性,以及版本升級的引導(dǎo)。 前言 我們知道Dubbo在2011年開源,停止更新了一段時間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發(fā)布了 2.5.4 版本。隨后,版本...

    qqlcbb 評論0 收藏0
  • dubbo個人理解于應(yīng)用章(二)

    摘要:當(dāng)提供程序線程池耗盡時,不能發(fā)送到使用者端。一些錯誤修正動態(tài)配置不能刪除,支持參數(shù),監(jiān)控統(tǒng)計問題等新功能支持手冊線程池耗盡時自動堆棧轉(zhuǎn)儲。在注冊表無法連接時被阻止。正常關(guān)機(jī),在注冊表取消注冊和線程池關(guān)閉之間增加額外的等待時間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對接sp...

    AlphaWallet 評論0 收藏0
  • dubbox/dubbo+spring+mybatis+gradle構(gòu)建REST服務(wù)

    摘要:修正了在上的部分修正了比如協(xié)議中序列化的問題。配置文件在配置配置在目錄下面配置后的工程基本目錄結(jié)構(gòu)在項目 雜七雜八的雜 個人博客: 呆萌的程序猿原文:dubbox/dubbo+spring+mybatis+gradle構(gòu)建REST服務(wù)聲明:由于sf的編輯自動校驗,導(dǎo)致某些英文單詞出錯,例如:gradle被編輯器自動替換為grade,jdk替換為idk等,查看的時候,請自行翻譯。 ---...

    fireflow 評論0 收藏0
  • 一個JAVA開發(fā)一年的總結(jié)

    摘要:前言到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。自己做出了一件很棒的事情完全可以拿去和別人炫耀,比如你用了一個很好的設(shè)計模式,比如你優(yōu)化了一個功能讓他快了倍,比如你開發(fā)了一個很棒的工具。 前言 到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。記錄如下,如有不當(dāng),還望指點。 技術(shù) 看...

    Reducto 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<