问题描述:
用户在访问小程序,并且已经登录,此时客户端的sessionid由服务器已经分配,并且在服务器端已经创建了部分与该客户端(或者说该sessionid)相绑定的session值;
此时服务器重启,将清空所有session值,当客户端再次访问服务器时,会获取数据失败,或重新登录
主要场景:
1、服务器重启后,客户端权限丢失,需要重新登录
2、小程序获取手机号(或其它)失败等
解决方案:
1、让session值持久化,持久化内容有:sessionid,以及和该sessionid相绑定的所有session值
- 1)、通过数据库
- 2)、通过redis
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);}}