Redis应用:session分离 【session序列化失败 JSONException异常 spring-session-data-redis实现】

本文介绍了使用Redis进行session分离的思路,包括将session信息序列化存储到Redis以及通过sessionID从Redis中获取数据。在实际操作中遇到了FastJSON反序列化异常,原因是HttpSession中的属性缺少set方法。为了解决这个问题,文章转向了使用spring-session-data-redis,详细介绍了如何引入依赖、配置YAML文件和添加配置类,最终实现了成功的session分离,并通过测试验证了其效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis应用:session分离 【session序列化失败 JSONException异常】

session分离思路

当用户在后台首次获取session后,将会在本次会话结束前的每次请求与响应中附带对应的SessionId,唯一对应后台的session域信息(这里分配sessionid并存入cookie是由tomcat自动完成)
所以,简答的思路就是

  1. 在首次获取session后,将sessionid作为键将对应session域信息序列化后保存到redis数据库内
  2. 需要获取session域信息时,拿着request携带的cookie中的sessionId值向redis数据库查找对应的数据,并反序列化为Session对象

代码示例

    /**
     * 保存session
     *
     * @param req 请求信心
     * @return 结果
     */
    @GetMapping("/saveSession")
    public AjaxResult saveSession(HttpServletRequest req){
   
        System.out.println(new Date()+":::"+req.getSession().getId());
        HttpSession session = req.getSession();
        session.setAttribute("num",num++);
        String sessionString = JSON.toJSONString(session);
        redisFullUtil.set(session.getId(),sessionString);
        return AjaxResult.success(session.getId()+"::"+session.getAttribute("num"));
    }


    /**
     * 获取保存的session
     *
     * @param req 请求信息
     * @return 结果
     */
    @GetMapping("/getSession")
    public AjaxResult getSession(HttpServletRequest req){
   
        System.out.printl
11:43:29.192 [http-nio-8080-exec-20] ERROR c.d.f.w.e.GlobalExceptionHandler - [handleRuntimeException,109] - 请求地址'/manage/order/top-selling',发生未知异常. com.alibaba.fastjson2.JSONException: offset 1, character 可, line 1, column 2, fastjson-version 2.0.43 可口可乐 at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:303) at com.alibaba.fastjson2.JSON.parseObject(JSON.java:768) at com.dkd.framework.config.FastJson2JsonRedisSerializer.deserialize(FastJson2JsonRedisSerializer.java:50) at org.springframework.data.redis.core.AbstractOperations.deserializeTuple(AbstractOperations.java:241) at org.springframework.data.redis.core.AbstractOperations.deserializeTupleValues(AbstractOperations.java:232) at org.springframework.data.redis.core.DefaultZSetOperations.reverseRangeWithScores(DefaultZSetOperations.java:215) at com.dkd.manage.controller.OrderController.getTopSellingProducts(OrderController.java:140) at com.dkd.manage.controller.OrderController$$FastClassBySpringCGLIB$$3a44bda3.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
最新发布
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值