精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费短视频成人日韩| 丰满女人性猛交| 男人添女人下部高潮视频在观看| 波多野结衣视频网址| 精品久久国产一区| 久久久亚洲精品石原莉奈| 久久精品国产清自在天天线| 久久av一区二区三区亚洲| 亚洲怡红院在线观看| 一区二区乱码| 国产激情视频一区二区三区欧美| 亚洲天堂精品在线| 波多野结衣之无限发射| 国产精品影院在线| 欧美1区2区3区4区| 亚洲主播在线观看| 成人妇女免费播放久久久| 中文字幕日韩三级片| 日本三级在线观看网站| 国产一区二区调教| 色婷婷综合久久久久| 黄色免费网址大全| 久久av少妇| 美女精品网站| 亚洲欧洲日韩国产| 美女又黄又免费的视频| 黄网站在线播放| 久久精品免费看| 中文字幕亚洲欧美日韩2019| 国产一级做a爰片久久| 国产黄色在线| av在线播放成人| 91国产在线精品| 手机在线看片日韩| 麻豆理论在线观看| 91麻豆免费观看| 欧美在线视频免费播放| 9.1成人看片免费版| 97久久香蕉国产线看观看| 不卡一区二区三区四区| 91精品国产高清| 欧美卡一卡二卡三| 国产精品99久久免费观看| 亚洲国产精品一区二区www| 官网99热精品| 日韩在线观看第一页| 日本一区福利在线| 欧美成人女星排名| 女人天堂av手机在线| 欧美新色视频| 亚洲在线一区| 色99之美女主播在线视频| 偷拍夫妻性生活| 黄色欧美视频| 一区二区三区中文字幕精品精品 | 国产伦理精品| 26uuu色噜噜精品一区二区| www.成人三级视频| 国产 欧美 日韩 在线| 精品9999| 亚洲视频在线播放| 色无极影院亚洲| 女优一区二区三区| 亚洲天堂男人天堂| 北条麻妃亚洲一区| 中文字幕在线直播| 日韩欧美国产成人| 一级黄色免费在线观看| 久cao在线| 亚洲欧美国产77777| 精品无人区一区二区三区 | 亚洲av无码一区二区三区网址| 成功精品影院| 欧美性69xxxx肥| 午夜肉伦伦影院| 91麻豆免费在线视频| 久久久久国色av免费看影院| 欧美日韩在线精品| 国产高清免费在线观看| 制服诱惑一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 男人网站在线观看| 精品一区二区三区中文字幕在线| 欧美精品v国产精品v日韩精品| 欧美啪啪免费视频| 电影亚洲精品噜噜在线观看| 亚洲一级片在线观看| 亚洲欧美国产精品桃花| 亚欧在线观看视频| 国产精品888| 国产麻豆一区二区三区在线观看| 国产在成人精品线拍偷自揄拍| 99视频+国产日韩欧美| 国产精品草莓在线免费观看| 久草资源在线视频| 久久精品欧美一区| 亚洲欧美日韩高清| 国产在线不卡av| 亚洲国产欧美日韩在线观看第一区| 久蕉依人在线视频| 视频在线观看一区| 久久久女女女女999久久| 国产第一页浮力| 波多野结衣在线观看一区二区三区 | 国产一二三av| 日韩av午夜| 色婷婷综合成人av| 成人精品在线看| 在线精品一区二区| 国产精品久久久久久久电影| 亚洲国产综合网| 国产一区二区三区在线观看精品| 国产精品乱码视频| 免费大片黄在线观看视频网站| 国产亚洲va综合人人澡精品| 国产视频一区二区三区四区| www.超碰在线.com| 国产成人啪免费观看软件| 蜜桃麻豆91| 国产视频网站在线| 亚洲国产中文字幕| 91小视频在线播放| 懂色av色香蕉一区二区蜜桃| 欧美卡1卡2卡| 日韩一级视频在线观看| 欧美日一区二区在线观看| 免费av一区二区| 久久精品黄色片| 欧美视频不卡| 91九色单男在线观看| 亚洲爱爱综合网| 国产精品国产三级国产| 自拍另类欧美| av在线免费观看网址| 亚洲影视资源网| 在线免费看污网站| 久久在线视频免费观看| 欧美伦理91i| 日韩 欧美 精品| 久久久久国产一区二区| 国产亚洲二区| gratisvideos另类灌满| 欧美性xxxx在线播放| 在线xxxxx| 欧美精选在线| http;//www.99re视频| 91蜜桃在线视频| 欧美一级一区二区| 国产乱了高清露脸对白| 狠久久av成人天堂| 国产精品6699| 国产乱子伦精品无码码专区| 国产亚洲欧洲997久久综合| www黄色av| 国产剧情一区| 久久99视频免费| va婷婷在线免费观看| 亚洲丝袜另类动漫二区| 黄色一级视频片| 女人抽搐喷水高潮国产精品| 97高清免费视频| 一级全黄裸体免费视频| 国产成人综合亚洲91猫咪| xxxxxx在线观看| 欧美成人黑人| 亚洲人a成www在线影院| 中文字幕永久在线| 国产精品毛片无遮挡高清| 成人免费在线网| 中文字幕日本一区二区| 亚洲第一精品福利| 久久日免费视频| 伊人成人在线| 欧美日本韩国一区二区三区| 亚洲1234区| 综合网中文字幕| 国产毛片毛片毛片毛片| 久久这里只有精品首页| 26uuu成人| 亚洲欧美日本国产| 按摩亚洲人久久| 久久露脸国语精品国产91| 91色九色蝌蚪| 中文字幕第38页| 亚洲精品国产setv| 国产精品爽爽爽| 污污视频在线观看网站| 色久综合一二码| 日批在线观看视频| 中文字幕一区二区三区在线视频| 国产91免费看片| 狠狠人妻久久久久久综合麻豆| 中文一区二区在线观看| 成年人免费大片| 欧美日韩麻豆| 国产精品视频在线播放| 免费成人av电影| 欧美日韩精品在线视频| 91人妻一区二区| 欧美日本不卡高清| 蜜桃视频在线观看91| 成人网av.com/| 5252色成人免费视频| 亚洲免费不卡视频| 色综合久久久网| 国产在线观看无码免费视频| 久久国产精品99精品国产 | 一区二区三区视频免费观看| 国产精选久久久久久| 女同视频在线观看| 正在播放亚洲一区| 多男操一女视频| 波多野结衣中文字幕一区二区三区| 亚洲精品一二三四五区| 亚洲高清二区| 日本xxx免费| 精品亚洲a∨一区二区三区18| 欧美自拍大量在线观看| 男女在线观看视频| www国产91| 国产裸舞福利在线视频合集| 亚洲电影免费观看高清完整版在线观看 | 日韩欧美成人免费视频| 久久久久久激情| 高清成人免费视频| 国产亚洲黄色片| 亚洲草久电影| 小说区图片区图片区另类灬| 欧美色网在线| 久久99久久99精品免观看粉嫩| 成人全视频高清免费观看| 欧美日韩一区二区三区四区| 中文字幕第69页| 国产老妇另类xxxxx| 女人色极品影院| 农村少妇一区二区三区四区五区| 97av影视网在线观看| 久久免费电影| 久久综合免费视频| 免费黄色在线| 精品国产一区二区三区在线观看 | 久久久久久亚洲综合| 91丝袜在线观看| 波多野结衣一区二区三区| 成人区人妻精品一区二 | 人妻aⅴ无码一区二区三区 | 国产99在线|中文| 涩涩涩在线视频| 97精品久久久| 女人高潮被爽到呻吟在线观看| 国产69精品久久久| 免费一二一二在线视频| 久久久久久一区二区三区 | 国内外成人免费激情在线视频| 欧美成人高清在线| 99国产精品一区二区三区| 午夜电影一区二区三区| 女人扒开腿免费视频app| 精品亚洲国内自在自线福利| 欧美黑人在线观看| 国内精品福利| 僵尸世界大战2 在线播放| 欧美日韩国产高清电影| 91免费版网站在线观看| 欧美午夜网站| 高清一区二区三区视频| 欧美成人一区在线观看| 另类视频在线观看+1080p| 欧美有码在线| 日韩午夜视频在线观看| 亚洲综合影院| 国产精品久久久久久久久婷婷 | 国产一二区在线| 欧美精品手机在线| av在线资源| 国产成人av网| 成人51免费| 国产精品一区二区三区免费观看 | 99只有精品| 精品中文字幕视频| 国模雨婷捆绑高清在线| 中文字幕无线精品亚洲乱码一区| aaa在线观看| 精品视频在线播放色网色视频| 国产av无码专区亚洲av| 精品卡一卡二卡三卡四在线| 免费理论片在线观看播放老| 中文字幕亚洲一区在线观看| 青草在线视频在线观看| 欧美在线中文字幕| 久久gogo国模啪啪裸体| 精品午夜一区二区三区| 久久精品不卡| 欧美一级免费播放| 蜜桃av噜噜一区| 日本男人操女人| 国产精品久久久亚洲一区| 国产精品国产三级国产专区51| 亚洲久久一区二区| 国产尤物av一区二区三区| 99久久婷婷国产综合精品电影√| 欧美日韩国产一二| 亚洲精品成人| 国产精品wwwww| 国产福利精品一区二区| 丁香激情五月少妇| 国产欧美一区二区三区在线老狼| a级在线观看视频| 亚洲欧洲成人精品av97| 99久久久无码国产精品不卡| 亚洲午夜一二三区视频| 在线观看毛片网站| 欧美亚洲一区二区在线观看| 9i精品福利一区二区三区| 亚洲成av人片在www色猫咪| 中文字幕日本视频| 欧美三级视频在线| 蜜桃视频污在线观看| 亚洲第一色在线| 在线观看免费网站黄| 2020久久国产精品| h视频久久久| av电影一区二区三区| 日韩电影在线一区二区三区| 国产野外作爱视频播放| 成人动漫一区二区在线| 中文字幕人妻一区二| 欧美视频在线观看一区| 欧美日韩伦理片| 97碰碰碰免费色视频| 日韩亚洲精品在线观看| 好看的日韩精品视频在线| 一区二区在线影院| 国产福利精品一区二区三区| 欧美精彩视频一区二区三区| 在线永久看片免费的视频| 欧美日韩视频一区二区| 久青草国产在线| 热久久美女精品天天吊色| 秋霞蜜臀av久久电影网免费| www.av毛片| 成人激情小说网站| 日本a在线观看| 亚洲二区中文字幕| 成人性生交大片免费看网站| 国产精品9999久久久久仙踪林| 欧美国产激情| 国产最新免费视频| 日本不卡免费在线视频| 久久久久亚洲av片无码v| 国产精品成人免费| 91在线公开视频| 久久影视电视剧免费网站| 国产精久久久| 亚洲啊啊啊啊啊| 国产**成人网毛片九色| 久久精品99久久久久久| 精品久久久久香蕉网| 国产白丝在线观看| 精品一区二区三区免费毛片| 国产亚洲精品v| 一区二区精品免费| 欧美日韩一区视频| 国产黄a三级三级三级av在线看| 91久久精品久久国产性色也91| 中文不卡在线| av电影在线播放| 懂色av影视一区二区三区| 国产资源在线播放| 91精品久久久久久久久久| 欧美中文一区| 国产视频在线视频| 亚洲日本在线a| 亚洲精品中文字幕成人片| 69久久夜色精品国产7777 | 国产视频精品在线| 日韩欧美精品一区二区综合视频| 中文字幕av日韩精品| 国产不卡视频一区| 精品不卡一区二区| 久久久91精品国产| 免费成人三级| 亚洲 欧美 另类人妖| 亚洲美女免费在线| 青青草手机在线| 国产区精品视频| 亚洲黄色影院| 能直接看的av| 欧美videos中文字幕| 国产精品高清乱码在线观看 | 一区二区三区在线观看免费视频| 91精品国产入口在线| 午夜影院一区| 免费观看黄色的网站| 91麻豆精品在线观看| 国产日韩在线观看一区| 欧洲成人免费aa| 欧美fxxxxxx另类| 一区二区三区在线观看免费视频| 精品国产一区a|