背景
在本地session移至redis存儲時,原本以為引入spring-session-data-redis依賴,配置RedisHttpSessionConfiguration,在web.xml中引入springSessionRepositoryFilter就結束了,沒想到遇到序列化相關的問題,具體就是只有getter,沒有setter。日誌如下:
分析
提示很清楚,就是shiro的SimplePrincipalCollection類中realmNames字段沒有setter方法,沒法反序列化。
來看看realmNames是什麽鬼,作為成熟的框架也偷懶不寫setter?仔細壹看,發現並不簡單。類裏面沒有realmNames,只有個getRealmNames方法。
原來是個假getter,是由其他字段動態生成的,如下:
看下redis裏面存的值
核心就是objectMapper.addMixIn()和objectMapper.setFilters()兩個方法
SimplePrincipalCollection是需要處理的類,IncludShiroFields就是壹個簡單的接口,如下:
通過上面的配置間接控制SimplePrincipalCollection類中必要字段的序列化,從而解決了問題。
ps :因為使用了註解,壹定要去掉objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false),不然配置不生效。