获取sessionid_小程序:如何解决服务端重启后客户端sessionid不一致的问题?

问题描述:

用户在访问小程序,并且已经登录,此时客户端的sessionid由服务器已经分配,并且在服务器端已经创建了部分与该客户端(或者说该sessionid)相绑定的session值;

此时服务器重启,将清空所有session值,当客户端再次访问服务器时,会获取数据失败,或重新登录

主要场景:

1、服务器重启后,客户端权限丢失,需要重新登录

2、小程序获取手机号(或其它)失败等

解决方案:

1、让session值持久化,持久化内容有:sessionid,以及和该sessionid相绑定的所有session值

  • 1)、通过数据库
  • 2)、通过redis
a5d20da4ad7547d9572e56a158f58f58.png

2、写一个公用的判断方法,主要功能,判断当前sessionid与客户端传到后台的cookies值中的JSESSIONID是否一致,如果一致,不做处理

如果不致,根据客户端传的sessionid查询是否存在,如果存在,查询该sessionid绑定的所有值,并重新添加到session中;

代码如下:

@Controller@Validated@RequestMapping(value="/test")public class testController extends BaseController {private String sessionId = null;JedisUtil jedisUtil = JedisUtil.getInstance();JedisUtil.Strings redisListsObj = jedisUtil.new Strings();JedisUtil.Keys redisKeysObj = jedisUtil.new Keys();@RequestMapping(value="/get_again_sessionid",method = RequestMethod.GET)@ResponseBodypublic Object get_again_sessionid(HttpServletRequest request,HttpServletResponse response,HttpSession httpSession){Map map = new HashMap();PageData transmitObj = new PageData();System.out.println("当前新的sessionid:::"+httpSession.getId());sessionId=httpSession.getId();if(request.getCookies() !=null){for (Cookie c : request.getCookies()) {System.out.println("原来老的sessionid:::"+c.getName().equals("JSESSIONID"));if (c.getName().equals("JSESSIONID")) {System.out.println("JSESSIONID=" + c.getValue());if (!c.getValue().equals(sessionId)) {System.out.println("重新ddddddddddddddddddddddd");String JSESSIONID=redisListsObj.get("JSESSIONID_"+c.getValue()+"_session_key");//redisKeysObj.exists("JSESSIONID_"+c.getValue()+"_session_key")if(JSESSIONID!=null){httpSession.setAttribute("session_key", JSESSIONID);redisListsObj.setnx("JSESSIONID_"+httpSession.getId()+"_session_key", JSESSIONID);redisKeysObj.del("JSESSIONID_"+c.getValue()+"_session_key");}}}}} map.put("sessionid", httpSession.getId());System.out.println("当前sessionid:"+httpSession.getId());return AppUtil.returnObject(transmitObj, map);}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值