精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個詭異的Json反序列化問題

開發 前端
我最近在做知識星球中的商品秒殺系統,寫了一個filter,獲取用戶請求的header中獲取JWT的token信息。然后根據token信息,獲取到用戶信息。在轉發到業務接口之前,將用戶信息設置到用戶上下文當中。這樣接口中的業務代碼,就能通過用戶上下文,獲取到當前登錄的用戶信息了。

前言

最近我在做知識星球中的商品秒殺系統,昨天遇到了一個詭異的json反序列化問題,感覺挺有意思的,現在拿出來跟大家一起分享一下,希望對你會有所幫助。

案發現場

我最近在做知識星球中的商品秒殺系統,寫了一個filter,獲取用戶請求的header中獲取JWT的token信息。

然后根據token信息,獲取到用戶信息。

在轉發到業務接口之前,將用戶信息設置到用戶上下文當中。

這樣接口中的業務代碼,就能通過用戶上下文,獲取到當前登錄的用戶信息了。

我們的token和用戶信息,為了性能考慮都保存到了Redis當中。

用戶信息是一個json字符串。

當時在用戶登錄接口中,將用戶實體,使用fastjson工具,轉換成了字符串:

JSON.toJSONString(userDetails);

保存到了Redis當中。

然后在filter中,通過一定的key,獲取Redis中的字符串,反序列化成用戶實體。

使用的同樣是fastjson工具:

JSON.parseObject(json, UserEntity.class);

但在反序列化的過程中,filter拋異常了:com.alibaba.fastjson.JSONException: illegal identifier : \pos 1, line 1, column 2{\"accountNonExpired\":true,\"accountNonLocked\":true,\"authorities\":[{\"authority\":\"admin\"}],\"credentialsNonExpired\":true,\"enabled\":true,\"id\":13,\"password\":\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\",\"roles\":[\"admin\"],\"username\":\"admin\"}

2 分析問題

我剛開始以為是json數據格式有問題。

將json字符串復制到在線json工具:https://www.sojson.com,先去掉化之后,再格式數據,發現json格式沒有問題:

圖片圖片

然后寫了一個專門的測試類,將日志中打印的json字符串復制到json變量那里,使用JSON.parseObject方法,將json字符串轉換成Map對象:

public class Test {

    public static void main(String[] args) {
        String json = "{\"accountNonExpired\":true,\"accountNonLocked\":true,\"authorities\":[{\"authority\":\"admin\"}],\"credentialsNonExpired\":true,\"enabled\":true,\"id\":13,\"password\":\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\",\"roles\":[\"admin\"],\"username\":\"admin\"}";
        Map map = JSON.parseObject(json, Map.class);
        // 輸出解析后的 JSON 對象
        System.out.println(map);
    }
}

執行結果:

{password=$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe, credentialsNnotallow=true, roles=["admin"], accountNnotallow=true, id=13, authorities=[{"authority":"admin"}], enabled=true, accountNnotallow=true, username=admin}

竟然轉換成功了。

這就讓我有點懵逼了。。。

為什么相同的json字符串,在Test類中能夠正常解析,而在filter當中卻不行?

當時怕搞錯了,debug了一下filter,發現獲取到的json數據,跟Test類中的一模一樣:

圖片圖片

帶著一臉的疑惑,我做了下面的測試。

莫非是反序列化工具有bug?

3 改成gson工具

我嘗試了一下將json的反序列化工具改成google的gson,代碼如下:

Map map = new Gson().fromJson(userJson, Map.class);

運行之后,報了一個新的異常:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $

這里提示json字符串中包含了:$。

而$是特殊字符,password是做了加密處理的,里面包含$和.,這兩種特殊字符。

為了快速解決問題,我先將這兩個特字符替換成空字符串:

json = json.replace("$","").replace(".","");

日志中打印出的json中的password,已經不包含這兩個特殊字符了:

2a10o3XfeGr0SHStAwLuJRW6ykE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe

但調整之后代碼報了下面的異常:com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.

跟剛剛有點區別,但還是有問題。

4 改成jackson工具

我又嘗試了一下json的反序列化工具,改成Spring自帶的的jackson工具,代碼如下:

ObjectMapper objectMapper = new ObjectMapper();
try {
    Map map = objectMapper.readValue(json, Map.class);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

調整之后,反序列化還是報錯:com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\' (code 92)): was expecting double-quote to start field name

3種反序列化工具都不行,說明應該不是fastjson的bug導致的當前json字符串,反序列化失敗。

到底是什么問題呢?

5 轉義

之前的數據,我在仔細看了看。

里面是對雙引號,是使用了轉義的,具體是這樣做的:\"。

莫非還是這個轉義的問題?

其實我之前已經注意到了轉義的問題,但使用Test類測試過,沒有問題。

當時的代碼是這樣的:

public class Test {

    public static void main(String[] args) {
        String json = "{\"accountNonExpired\":true,\"accountNonLocked\":true,\"authorities\":[{\"authority\":\"admin\"}],\"credentialsNonExpired\":true,\"enabled\":true,\"id\":13,\"password\":\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\",\"roles\":[\"admin\"],\"username\":\"admin\"}";
        Map map = JSON.parseObject(json, Map.class);
        // 輸出解析后的 JSON 對象
        System.out.println(map);
    }
}

里面也包含了一些轉義字符。

我帶著試一試的心態,接下來,打算將轉義字符去掉。

看看原始的json字符串,解析有沒有問題。

怎么去掉轉義字符呢?

手寫工具類,感覺不太好,可能會寫漏一些特殊字符的場景。

我想到了org.apache.commons包下的StringEscapeUtils類,它里面的unescapeJava方法,可以輕松去掉Java代碼中的轉義字符。

于是,我調整了一下代碼:

json = StringEscapeUtils.unescapeJava(json);
JSON.parseObject(json, UserEntity.class);

這樣處理之后,發現反序列化成功了。

總結

這個問題最終發現還是轉義的問題。

那么,之前Test類中json字符串,也使用了轉義,為什么沒有問題?

當時的代碼是這樣的:

public class Test {

    public static void main(String[] args) {
        String json = "{\"accountNonExpired\":true,\"accountNonLocked\":true,\"authorities\":[{\"authority\":\"admin\"}],\"credentialsNonExpired\":true,\"enabled\":true,\"id\":13,\"password\":\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\",\"roles\":[\"admin\"],\"username\":\"admin\"}";
        Map map = JSON.parseObject(json, Map.class);
        System.out.println(map);
    }
}

但在filter中的程序,在讀取到這個json字符串之后,發現該字符串中包含了\轉義符號,程序自動把它變成了\\\。

調整一下Test類的main方法,改成三個斜杠的json字符串:

public static void main(String[] args) {
    String json = "{\\\"accountNonExpired\\\":true,\\\"accountNonLocked\\\":true,\\\"authorities\\\":[{\\\"authority\\\":\\\"admin\\\"}],\\\"credentialsNonExpired\\\":true,\\\"enabled\\\":true,\\\"id\\\":13,\\\"password\\\":\\\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\\\",\\\"roles\\\":[\\\"admin\\\"],\\\"username\\\":\\\"admin\\\"}";
    Map map = JSON.parseObject(json, Map.class);
    System.out.println(map);
}

執行結果:Exception in thread "main" com.alibaba.fastjson.JSONException: illegal identifier : \pos 1, line 1, column 2{\"accountNonExpired\":true,\"accountNonLocked\":true,\"authorities\":[{\"authority\":\"admin\"}],\"credentialsNonExpired\":true,\"enabled\":true,\"id\":13,\"password\":\"$2a$10$o3XfeGr0SHStAwLuJRW6y.kE0UTerQfv3SXrAcVLuJ6M3hEsC9RKe\",\"roles\":[\"admin\"],\"username\":\"admin\"}拋出了跟文章最開始一樣的異常。

說明其實就是轉義的問題。

之前,我將項目的日志中的json字符串,復制到idea的Test的json變量中,當時將最外層的雙引號一起復制過來了,保存的是1個斜杠的數據。

這個操作把我誤導了。

而后面從在線的json工具中,把相同的json字符串,復制到idea的Test的json變量中,在雙引號當中粘貼數據,保存的卻是3個斜杠的數據,它會自動轉義。

讓我意識到了問題。

好了,下次如果遇到類似的問題,可以直接使用org.apache.commons包下的StringEscapeUtils類,先去掉轉義,再反序列化,這樣可以快速解決問題。

此外,這次使用了3種不同的反序列化工具,也看到了其中的一些差異。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2015-05-08 12:41:36

C++序列化反序列化庫Kapok

2022-08-06 08:41:18

序列化反序列化Hessian

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2021-11-18 07:39:41

Json 序列化Vue

2019-11-20 10:07:23

web安全PHP序列化反序列化

2011-06-01 15:05:02

序列化反序列化

2018-03-19 10:20:23

Java序列化反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2009-08-24 17:14:08

C#序列化

2009-06-14 22:01:27

Java對象序列化反序列化

2009-08-06 11:16:25

C#序列化和反序列化

2023-12-13 13:49:52

Python序列化模塊

2011-05-18 15:20:13

XML

2024-10-07 08:26:53

2012-04-13 10:45:59

XML

2011-06-01 14:50:48

2009-08-25 14:24:36

C#序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2010-03-19 15:54:21

Java Socket
點贊
收藏

51CTO技術棧公眾號

久久精品毛片| 欧美激情在线免费| 一区二区在线观看免费| 成人影片在线播放| 久久免费在线观看视频| 人人香蕉久久| 欧美日韩一区二区在线观看 | 成人小视频在线看| 视频三区在线| 国产精品一区二区免费不卡| 992tv在线成人免费观看| 亚洲黄色小说视频| 日本一区影院| 欧美最猛黑人xxxxx猛交| a级片一区二区| 你懂的好爽在线观看| 激情综合色综合久久综合| 69视频在线免费观看| 97在线观看视频免费| 日韩有码av| 日韩三级.com| 污污视频网站免费观看| 里番在线播放| 中文字幕中文乱码欧美一区二区| 国产激情美女久久久久久吹潮| 欧美另类高清videos的特点| 亚洲精品韩国| 欧美成人精品一区| 快灬快灬一下爽蜜桃在线观看| 韩国女主播一区二区三区| 欧美日韩亚洲综合在线| cao在线观看| av网址在线| 欧美国产精品一区二区三区| 精品一区二区三区国产| jlzzjlzzjlzz亚洲人| 蜜臀av在线播放一区二区三区| 国内精品一区二区三区四区| 国产盗摄一区二区三区在线| 日本欧美肥老太交大片| 日韩av中文在线| 色悠悠在线视频| 国产午夜久久av| 欧美日韩日日摸| 成人在线看视频| 中文在线а√在线8| 亚洲国产你懂的| 男女裸体影院高潮| 综合久久2019| 亚洲精品一二三区| 欧美日韩亚洲国产成人| 精品国产99久久久久久| 国产精品久久久99| 亚洲精品中文综合第一页| 国产一二在线观看| 久久九九久精品国产免费直播| 精品免费日产一区一区三区免费| 日韩一区二区三区不卡| 成人av在线一区二区三区| 99在线观看| 可以免费观看的毛片| 国产91精品一区二区麻豆网站| 91久久国产综合久久蜜月精品 | 亚洲精品美女久久久| 中国免费黄色片| 精品午夜电影| 日韩精品亚洲元码| 国产全是老熟女太爽了| 国产精品一线天粉嫩av| 中文在线不卡视频| 国产主播av在线| 亚洲精品a级片| 欧美高跟鞋交xxxxxhd| 日本五十路女优| 在线综合亚洲| 国产精品视频xxxx| 国产成人精品毛片| av一本久道久久综合久久鬼色| 精品欧美一区二区三区久久久| 三级做a全过程在线观看| 欧美激情在线观看视频免费| 爱爱爱视频网站| 欧美亚洲天堂| 91精品办公室少妇高潮对白| 日本三级黄色网址| 欧一区二区三区| 亚洲精品乱码久久久久久按摩观| 人人爽人人爽人人片| 一区二区日韩欧美| 午夜精品蜜臀一区二区三区免费| 黄色免费av网站| 久久电影网电视剧免费观看| 成人自拍爱视频| 国产色a在线| 伊人夜夜躁av伊人久久| 欧美黄色免费影院| 婷婷久久免费视频| 亚洲国产欧美一区| 欧美成人久久久免费播放| 欧美日韩亚洲三区| 国产成人精品综合久久久| va视频在线观看| 国产亚洲美州欧州综合国| 400部精品国偷自产在线观看 | 天天影视涩香欲综合网| 九九热在线免费| 亚洲日本视频在线| 日韩在线精品一区| 久久久久久久久影院| 精品一区二区三区在线观看| 久久99导航| 精品国产99久久久久久| 色视频一区二区| 岛国精品一区二区三区| 成人在线免费观看视频| 91精品国产自产91精品| 一区二区日韩在线观看| 91小视频免费观看| av动漫在线播放| 成人在线网站| 亚洲激情免费观看| 亚洲二区在线播放| 玖玖在线精品| 国产精品伊人日日| caopeng在线| 欧美色倩网站大全免费| 草草地址线路①屁屁影院成人| 亚洲精品国产成人影院| 国产精品久久久久av免费| 天堂在线观看av| 亚洲人成亚洲人成在线观看图片| 亚洲精品高清无码视频| 欧美变态网站| 欧美激情一区二区三区在线视频观看| 免费av中文字幕| 久久婷婷成人综合色| 国产精品裸体瑜伽视频| 亚洲三区欧美一区国产二区| 久久精品成人欧美大片| 中文字幕在线观看1| 国产午夜精品在线观看| 99精品视频在线看| 日韩丝袜视频| 5278欧美一区二区三区| 欧美自拍偷拍第一页| 一区二区三区四区视频精品免费 | 精品深夜福利视频| 欧美放荡办公室videos4k| 国产区精品在线| 亚洲男人的天堂在线观看| 亚洲图片 自拍偷拍| 天天做天天爱天天爽综合网| 成人精品一区二区三区电影免费 | 亚洲2020天天堂在线观看| 亚洲精品一区二区口爆| 亚洲一区二区av在线| www.四虎在线| 国产欧美丝祙| 日本欧洲国产一区二区| 免费在线成人激情电影| 色妞久久福利网| 91免费视频播放| 亚洲欧美日韩久久| 香蕉视频1024| 99热这里只有成人精品国产| 免费一区二区三区| 人人鲁人人莫人人爱精品| 伊人久久免费视频| 国产又粗又猛又爽又黄视频| 一区二区在线看| 中文字幕在线播放视频| 国产一区二区高清| 欧美资源一区| 99久久999| 久久免费成人精品视频| 欧美女优在线观看| 欧美日韩在线播放三区四区| 杨钰莹一级淫片aaaaaa播放| 成人午夜看片网址| 日日碰狠狠丁香久燥| 欧美超碰在线| 国产日韩在线一区二区三区| 校园春色亚洲色图| 久久不射热爱视频精品| 无码国产精品高潮久久99| 色婷婷国产精品久久包臀| 成人小视频免费看| 国产高清精品在线| 漂亮人妻被中出中文字幕| 日韩精品永久网址| 国产精品一区二区你懂得| 播放一区二区| 色综合久久中文字幕综合网小说| 污视频网站在线播放| 欧美色图天堂网| 99视频在线看| 中文字幕日韩精品一区| 国产精品无码电影| 麻豆精品在线播放| 青青青免费在线| 五月天久久777| 久久久水蜜桃| 亚洲3区在线| 国产精品久久久久久久午夜| 国产一线二线在线观看| 爽爽爽爽爽爽爽成人免费观看| 十八禁一区二区三区| 欧美精品三级在线观看| 亚洲天堂视频网站| 亚洲自拍与偷拍| 国产黄色录像视频| 99视频精品在线| 日韩av福利在线观看| 日韩电影在线看| 秋霞无码一区二区| 亚洲国产一成人久久精品| 欧美日韩一区在线播放| 在线视频亚洲欧美中文| 成人国内精品久久久久一区| 欧美gay视频| 久久久久久网址| 精品自拍一区| 日韩一中文字幕| 高清福利在线观看| 亚洲精品97久久| 国产手机av在线| 欧美精品 国产精品| 波多野结衣二区三区| 精品人伦一区二区三区蜜桃网站 | 97人妻人人揉人人躁人人| 成人av在线一区二区| wwwxxx色| 国产剧情一区二区三区| 天堂av8在线| 免费观看久久久4p| 日本999视频| 日韩av一区二区三区| 超碰网在线观看| 国产精品普通话对白| 欧美极品欧美精品欧美| 精品91视频| 欧洲精品一区二区三区久久| 黄色国产精品| 免费的一级黄色片| 欧美三级网页| 日韩精品一区二区免费| 激情综合中文娱乐网| 免费特级黄色片| 在线欧美日韩| 久久成人免费观看| 免费亚洲一区| 丁香婷婷激情网| 美国欧美日韩国产在线播放| 中文字幕av不卡在线| 久久9热精品视频| 91亚洲精品久久久蜜桃借种| 精品写真视频在线观看| 国内av免费观看| 国产98色在线|日韩| 日本50路肥熟bbw| av在线不卡网| 大又大又粗又硬又爽少妇毛片| 91美女视频网站| 亚洲天堂岛国片| 亚洲少妇30p| 国产大片中文字幕在线观看| 欧美日韩亚洲视频| 日本精品入口免费视频| 欧美日韩激情一区二区三区| 国产精品污视频| 精品福利av导航| 免费国产在线视频| 色系列之999| 欧美人体视频xxxxx| 欧美亚洲成人精品| 成人av色网站| 产国精品偷在线| 免费成人结看片| 黄色一级片网址| 一区二区三区福利| 免费涩涩18网站入口| 国产剧情一区二区| 30一40一50老女人毛片| 国产精品久久久久久一区二区三区| 国产大片免费看| 一本大道久久a久久综合| 国产又粗又大又黄| 亚洲精品福利资源站| jizz日韩| 久久全国免费视频| 丁香婷婷久久| 狠狠干一区二区| 999久久久国产精品| 国产极品尤物在线| 精品一区二区国语对白| 粉嫩av懂色av蜜臀av分享| 国产精品高潮呻吟| 五月天综合激情网| 91精品国产乱| 成人免费黄色网页| 国产69精品久久久久9| 国产一区二区三区四区五区3d| 成人欧美一区二区| 欧美成人自拍| 黄色动漫在线免费看| 国产在线精品一区二区三区不卡| 成年人网站免费看| 一个色在线综合| 亚洲综合免费视频| 国产手机视频精品| 久久亚洲资源| 成人美女免费网站视频| 在线看成人短视频| av网站大全免费| 久久精品国产一区二区三| 天堂久久久久久| 久久一级大片| 中文字幕av一区二区| free性m.freesex欧美| 成人黄色在线播放| 五月国产精品| 黄色一级视频在线播放| 国产一区二区精品久久99| 日韩av片在线| 色哟哟日韩精品| 日韩三级电影网| 91精品国产91| 国产精品丝袜在线播放| 国产91沈先生在线播放| 国产一区二区三区免费播放| 国产1区2区在线观看| 欧美午夜激情视频| 好吊视频一区二区三区| 欧美成人免费在线观看| 国产精品日本一区二区三区在线 | 男人添女人荫蒂国产| 中文字幕一区二区在线观看| 这里只有精品999| 国产一区二区三区在线看| 成人影院入口| 欧美一区二区综合| 另类亚洲自拍| 国产精品亚洲无码| 欧美天堂在线观看| 欧洲亚洲精品视频| 欧美一区第一页| 西野翔中文久久精品国产| 97国产精东麻豆人妻电影| 成人永久aaa| 日韩精品国产一区二区| 亚洲国产精品成人一区二区| 女人天堂av在线播放| 成人片在线免费看| 亚洲国产清纯| 日本丰满少妇裸体自慰| 欧美日韩亚洲高清| 国产三级在线观看| 国产欧美婷婷中文| 伊人久久大香线| 亚洲精品成人无码毛片| 亚洲v精品v日韩v欧美v专区 | xvideos成人免费中文版| 亚洲日本中文| 成人免费看片'免费看| 成人精品视频一区| 99久久精品国产亚洲| 夜夜躁日日躁狠狠久久88av| 国产精品高潮久久| 9191国产视频| 97se狠狠狠综合亚洲狠狠| 无码无套少妇毛多18pxxxx| 中文字幕亚洲欧美| 日本一区二区三区视频在线看| 妞干网在线观看视频| 26uuu国产电影一区二区| 中文字幕乱码视频| 米奇精品一区二区三区在线观看| 中文字幕一区二区三区四区久久 | 久久99久久久欧美国产| 亚洲av无码一区二区三区在线| 精品99999| 日韩毛片免费观看| www.亚洲一区二区| av不卡一区二区三区| 在线免费观看中文字幕| 欧美大片网站在线观看 | 亚洲人成电影在线播放| 不卡精品视频| 日韩中文字幕在线视频观看| 欧美韩国日本一区| 亚洲风情第一页| 国产成人一区二区在线| 伊人久久大香线蕉综合四虎小说 | 岛国av一区二区在线在线观看| av大片在线观看| 国产伦精品一区二区三区高清| 蜜桃av噜噜一区二区三区小说| 久久久久97国产| 中文字幕欧美日韩| 精品一区二区男人吃奶|