记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题

一、问题描述

项目追加Redis缓存后,报错autotype is not support错误。根据网上资料解决后,报Json解析错误,后查看Redis数据库中该数据格式发现,存入的是枚举名称(即字符串),而接收的是对象类型,故报错

二、查找并解决

1.查看日志,报autoType is not support错误,上百度!--->FastJson解析失败,autotype is not support!这是博主给出的原因。

2017年3月15日,fastjson官方发布安全升级公告,该公告介绍fastjson在1.2.24及之前的版本存在代码执行漏洞,当恶意攻击者提交一个精心构造的序列化数据到服务端时,由于fastjson在反序列化时存在漏洞,可导致远程任意代码执行。

自1.2.25及之后的版本,禁用了部分autotype的功能,也就是”@type”这种指定类型的功能会被限制在一定范围内使用。

而由于反序列化对象时,需要检查是否开启了autotype。所以如果反序列化检查时,autotype没有开启,就会报错

记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题

    既然找到了原因,安排!

@Configuration
public class RedisConfig {
 
    RedisConfig(){
        //打开autotype功能
        ParserConfig.getGlobalInstance()
                //需要开启autotype的全类名
            .addAccept("com.entity.dto.UserDTO");
    }
}

然后接收报错,记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题,不过这次是json格式错误导致解析失败。

百思不得其解,为啥存入时序列化没问题,取出反序列化就报错?

难道是姿势不对?

换个坐姿,还是不行。

咋整?

直接看Redis数据库数据!

果不其然,Java中Metric是个对象,但是数据库中确实字符串!

记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题

为何出现这种情况呢?是因为,在给Metric赋值的时候,采取了枚举类,此时序列化会序列化为字符串,而不是对象类型!!!

记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题

如何解决?

自定义Metric对象,而不是采用枚举类!

import org.springframework.data.geo.Metric;

/**
 * @Description : 自定义Metric 类
 */
public class KilometersMetric implements Metric {

    public KilometersMetric(){

    }

    @Override
    public double getMultiplier() {
        return 6378.137D;
    }

    @Override
    public String getAbbreviation() {
        return "km";
    }
}

此时再看Redis中数据格式,已经为对象形式,就没有了序列化问题了。

记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题

完结,撒花,又是记录下获取Redis的GEO类型数据后,使用FastJson解析报错问题的一天。

上一篇:2020阿里云双11种草清单


下一篇:Cookie与Session