解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support
Posted BUG小能手
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support相关的知识,希望对你有一定的参考价值。
1.问题描述
在使用redis时,配置自定义序列化redisTemplate为FastJsonRedisSerializer .
1 /** 2 * 自定义redis序列化器 3 */ 4 @SuppressWarnings("unchecked") 5 @Bean("redisTemplate") 6 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) { 7 8 RedisTemplate<Object, Object> template = new RedisTemplate<>(); 9 // 配置连接工厂 10 template.setConnectionFactory(factory); 11 12 // 使用fastJson序列化 13 FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); 14 15 // key的序列化采用StringRedisSerializer 16 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 17 template.setKeySerializer(stringRedisSerializer); 18 template.setHashKeySerializer(stringRedisSerializer); 19 20 // value值的序列化采用fastJsonRedisSerializer 21 template.setValueSerializer(fastJsonRedisSerializer); 22 template.setHashValueSerializer(fastJsonRedisSerializer); 23 24 return template; 25 }
redis中数据结构为:{"@type":"com.***.UserEntity","id":"1177881490377158658","nickName":"test"}
在反序列化时报错 com.alibaba.fastjson.JSONException: autoType is not support.
二.原因分析
2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于fastjson在反序列化时存在漏洞,可导致远程任意代码执行。
自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。
而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错。
三.解决办法
官方给出的开启autotype的方法:enable_autotype
我采用的第一种:在代码中配置白名单
1 import com.alibaba.fastjson.JSON; 2 import com.alibaba.fastjson.parser.ParserConfig; 3 import com.alibaba.fastjson.serializer.SerializerFeature; 4 import org.springframework.data.redis.serializer.RedisSerializer; 5 import org.springframework.data.redis.serializer.SerializationException; 6 7 import java.nio.charset.Charset; 8 9 /** 10 * 自定义redis序列化 11 * 12 * @param <T> 13 * @author xhq 14 * @version 1.0 15 * @date 2019年11月15日 16 */ 17 public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { 18 19 private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 20 private Class<T> clazz; 21 22 /** 23 * 添加autotype白名单 24 * 解决redis反序列化对象时报错 :com.alibaba.fastjson.JSONException: autoType is not support 25 */ 26 static { 27 ParserConfig.getGlobalInstance().addAccept("com.***.UserEntity"); 28 } 29 30 public FastJsonRedisSerializer(Class<T> clazz) { 31 super(); 32 this.clazz = clazz; 33 } 34 35 @Override 36 public byte[] serialize(T t) throws SerializationException { 37 if (null == t) { 38 return new byte[0]; 39 } 40 return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); 41 } 42 43 @Override 44 public T deserialize(byte[] bytes) throws SerializationException { 45 if (null == bytes || bytes.length <= 0) { 46 return null; 47 } 48 String str = new String(bytes, DEFAULT_CHARSET); 49 return JSON.parseObject(str, clazz); 50 } 51 52 }
以上是关于解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support的主要内容,如果未能解决你的问题,请参考以下文章
解决com.alibaba.fastjson.JSONException: autoType is not support 异常处理
解决com.alibaba.fastjson.JSONException: autoType is not support 异常处理
解决com.alibaba.fastjson.JSONException: autoType is not support 异常处理