国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一個詭異的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

2019-11-20 10:07:23

web安全PHP序列化反序列化

2021-11-18 07:39:41

Json 序列化Vue

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對象序列化反序列化

2023-12-13 13:49:52

Python序列化模塊

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2024-10-07 08:26:53

2012-04-13 10:45:59

XML

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

2009-09-09 14:45:41

XML序列化和反序列化

2009-09-09 15:47:27

XML序列化和反序列化

2010-03-19 15:54:21

Java Socket
點贊
收藏

51CTO技術棧公眾號

国产模特精品视频久久久久| 成人午夜一级二级三级| 欧美色图在线播放| 中国成人亚色综合网站| 亚洲一区二区精品久久av| 亚洲精品永久免费视频| 国产精品一区专区欧美日韩| 国产超碰在线一区| 国产黄色免费在线观看| 欧美床上激情在线观看| 国产精品色网| 国产主播色在线| 亚洲人a成www在线影院| 欧美激情aⅴ一区二区三区| www日韩在线观看| 亚洲成人激情在线| 91精品久久久久久久蜜月| 女人另类性混交zo| 亚洲国产精品字幕| 欧美精品综合| 激情丁香在线| 久久精品小视频| 日本女人一区二区三区| 男人av在线| 18久久久久久| 91在线观看一区二区| 男插女视频久久久| 91在线观看网站| 亚洲日本va午夜在线影院| 欧美黑人疯狂性受xxxxx野外| 国产不卡一区二区三区在线观看| 中文字幕一区二区日韩精品绯色| 欧美1级2级| 欧美二区在线| 日韩欧美在线视频观看| 久久精品亚洲成在人线av网址| 亚洲最大色综合成人av| 欧美亚洲综合在线| 国产一卡不卡| 五月婷婷激情久久| 中文字幕免费精品一区高清| 青青国产91久久久久久 | 最新欧美日韩亚洲| 欧美日韩不卡一区| 久久精品国内一区二区三区水蜜桃| 国产美女视频黄a视频免费| 美女少妇精品视频| 99免费精品视频| 国外成人福利视频| 日韩中文字幕在线免费| 在线观看国产精品日韩av| 韩国av一区二区| 欧亚av在线| mm131午夜| 国产亚洲精品久久久久久| 国产成人av电影免费在线观看| 成人精品电影在线| 日本少妇高潮喷水视频| 欧美理论电影在线观看| 欧美国产欧美综合| 老司机成人在线| av电影免费| 国产精品日韩在线观看| 精品国产乱码久久久久久虫虫漫画| 欧美高清视频在线观看mv| 性网站在线看| 成人精品一二区| 日韩一区二区在线看片| 久久草av在线| 涩涩涩久久久成人精品| 亚洲精品一二三四五区| 欧美一级片一区| 欧美日韩美女在线| 亚洲深夜影院| 小h片在线观看| 欧美在线观看成人| 久久久久久国产精品久久| 亚洲男人天堂av网| 亚洲激情五月| 亚洲电影视频在线| 四虎免费在线观看视频| 理论片在线不卡免费观看| 中文字幕一区av| 欧美顶级大胆免费视频| 色综合久久久久综合一本到桃花网| 欧美午夜视频在线| 亚洲欧洲日本专区| 亚洲国产电影在线观看| 欧美一区二区三区激情视频| 欧美日韩视频在线播放| 经典三级在线视频| 韩日欧美一区二区| 欧美性生交大片免网| 日韩国产欧美视频| 日本电影久久久| 黄动漫在线看| 亚洲高清不卡一区| 欧美国产在线视频| 亚洲国产精品影院| 男女男精品视频| www.豆豆成人网.com| 久久免费看视频| 日本三级福利片| 午夜精品久久久久久久白皮肤| 色婷婷久久99综合精品jk白丝| 久久精品国内一区二区三区| 国产色噜噜噜91在线精品 | 3p视频在线观看| 水蜜桃在线免费观看| 欧美专区在线观看| 欧美一区二区三区在| 中国色在线观看另类| 亚洲在线国产日韩欧美| 96sao精品免费视频观看| 亚洲人av在线| 99久久免费观看| 91日韩在线播放| 中文字幕在线观看亚洲| 日韩欧美中文第一页| 成人国产精品免费网站| 欧美黄色精品| 中文字幕av一区二区三区四区| 在线看免费av| 亚洲77777| 亚洲国产欧美不卡在线观看| 国产99在线|中文| 亚洲精品720p| 黑人巨大精品欧美一区二区免费 | 欧美乱偷一区二区三区在线| 欧美日本高清一区| 日韩欧美的一区二区| 亚洲黄色尤物视频| 国产大片一区二区| 欧美日韩国产高清| 9999久久久久| 97人澡人人添人人爽欧美| 影音先锋可以看的网站| 日韩激情视频一区二区| 成人情视频高清免费观看电影| 欧美极品少妇xxxxⅹ免费视频| 欧美mv日韩mv国产网站app| 一区二区三区日韩精品视频| 成人免费视频网站在线观看| 亚洲一区二区网站| 精品美女在线视频| 久久国际精品| 国产免费拔擦拔擦8x在线播放| 色视频在线观看| 日韩爱爱小视频| 久草免费福利在线| 色视频一区二区三区| 亚洲free性xxxx护士白浆| 欧美www在线| 亚洲欧洲在线免费| 7777女厕盗摄久久久| 亚洲成av人片一区二区梦乃 | 国产精品久久久久影院| 欧美激情18p| 日韩免费av一区二区三区| 欧美一区 二区| 亚洲国产乱码最新视频 | 宅男午夜电影| 日韩小视频网站| 国产一区二区视频在线免费观看| 国语自产精品视频在线看| 亚洲乱码国产乱码精品精| 国产精品一级黄| 日韩乱码在线视频| 超碰成人久久| 日韩精品一区二| 国产精品日韩三级| 日韩在线观看| 欧美一区二区三区婷婷| gogo在线高清视频| 九色视频网站在线观看| 天天影视色香欲综合| 日本一极黄色片| 蜜桃传媒一区二区三区| 一区不卡视频| 日韩精品国内| 久久精品女人的天堂av| 成人性色av| 亚洲黄一区二区三区| 中文字幕日韩欧美精品高清在线| 青青久久av北条麻妃海外网| 亚洲大胆人体在线| av免费网站观看| 国产精品99一区二区| 亚洲曰韩产成在线| 久久中文娱乐网| 不卡的电视剧免费网站有什么| 久久成人久久鬼色| 麻豆极品一区二区三区| 日韩国产在线观看一区| 丝袜亚洲另类欧美| 免费久久99精品国产| 日本sm残虐另类| 国产精品亚洲综合一区在线观看| 久久av资源站| 国产福利91精品一区二区三区|