session,cookie,token
https://www.cnblogs.com/moyand/p/9047978.html
1.session,cookie,token谈谈你对它们的理解 --------会话,饼干,令牌
发展史 助于记忆
Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器
不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用记住是谁刚刚发了HTTP请求, 每个请求对我来说都是全新的。
后来 随着交互式Web应用的兴起,像在线购物网站,需要登录的网站等等
把(这样的称作会话。session)。马上就面临一个问题,那就是要管理会话,必须记住哪些人登录系统, 哪些人往自己的购物车中放商品, 也就是说我必须把每个人区分开。
在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。
会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。
这种在多次HTTP连接间维护用户与同一用户发出的不同请求之间关联的情况称为维护一个会话(session)
我用我的CPU计算时间获取了我的session 存储空间 !https://www.cnblogs.com/moyand/p/9047978.html
我的代码中的实际应用token
@RestController @RequestMapping(value = "/phonerest/coupon") public class AlipayArTransferCouponRestService extends BaseController { @Autowired private IAlipayArService alipayArService; @Value("${alipay.des.key}") private String desKey; @RequestMapping(value = "/transferBlessingCard", method = {RequestMethod.POST}) @ResponseBody public SimpleResponseVO transferCard(@RequestBody JSONObject json) { SimpleResponseVO responseVO = new SimpleResponseVO(); responseVO.setStatus(FAIL); /** 打印前端传入参数 */ LoggerUtil.info("支付宝AR 优惠活动,转赠卡,前端的入参是:----->>" + JSON.toJSONString(json)); try { String string = json.getString("token"); String decrypt = DESUtil.decode(string, desKey); AlipayTransferBlessingCardRequestVO transferBlessingCardRequestVO = JSONObject.parseObject(decrypt, AlipayTransferBlessingCardRequestVO.class); String timestamp = transferBlessingCardRequestVO.getTimestamp(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(timestamp); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar timenowbefore = Calendar.getInstance(); Calendar timenowafter = Calendar.getInstance(); timenowafter.setTime(new Date()); // timenowafter.add(Calendar.SECOND,+10); timenowafter.add(Calendar.MINUTE,+30);//测试 timenowbefore.setTime(new Date()); // timenowbefore.add(Calendar.MINUTE,-1); timenowbefore.add(Calendar.MINUTE,-30); //测试 LoggerUtil.info("入参时间:"+calendar); LoggerUtil.info("时间要在timenowbefore后:"+timenowbefore); LoggerUtil.info("时间要在timenowafter前:"+timenowafter); if (calendar.after(timenowbefore) && calendar.before(timenowafter)){ LoggerUtil.info("一分钟内传来的数据,继续执行正常逻辑"); String fromUserId = transferBlessingCardRequestVO.getFromUserId(); String toUserId = transferBlessingCardRequestVO.getToUserId(); String cardCode = transferBlessingCardRequestVO.getTransferCardCode(); //判断这张卡是不是大卡 String cardInfo = alipayArService.findCardByCardCodeAndUserId(cardCode,fromUserId); if (cardInfo.equals(FAIL)) { responseVO.setMessage("不能赠送大卡"); return responseVO; } //用户卡基本数小于8, String cardAmount = alipayArService.checkUserBasicCards(transferBlessingCardRequestVO.getToUserId()); if ("8".equals(cardAmount)) { responseVO.setMessage("您的基本福卡已有8张,不能继续获得"); return responseVO; } //用户赠送的该卡状态为未使用状态 responseVO = alipayArService.transferBlessingCard(fromUserId,toUserId,cardCode); return responseVO; } else { LoggerUtil.info("时间戳在现有时间范围外"); responseVO.setStatus(FAIL); responseVO.setMessage("时间戳超过30分钟"); return responseVO; } } catch (Exception e) { LoggerUtil.info("解密失败"); responseVO.setMessage("解密失败"); responseVO.setStatus(FAIL); return responseVO; } } }
@RestController @RequestMapping(value = "/phonerest/coupon") public class AlipayArCouponRestService extends BaseController { /** * 走抽福卡路 */ public static final String PUMPCARD = "PUMPCARD"; /** * 走合成福卡路 */ public static final String SYNTHESISCARD = "SYNTHESISCARD"; /** * 查询用户福卡明细 */ public static final String QUERYDETAILS = "QUERYDETAILS"; @Value("${alipay.des.key}") private String desKey; @Autowired private IAlipayArService alipayArService; @Autowired private IUserService userService; @RequestMapping(value = "/receiveBlessingCard", method = {RequestMethod.POST}) @ResponseBody public SimpleResponseVO checkScanCodeOrCombinedCard(@RequestBody JSONObject json) { SimpleResponseVO responseVO = new SimpleResponseVO(); responseVO.setStatus(FAIL); /** 打印前端传入参数 */ LoggerUtil.info("支付宝AR 优惠活动,前端的入参是:----->>" + JSON.toJSONString(json)); String string = json.getString("token"); String decrypt = DESUtil.decode(string, desKey); AlipayBlessingCardRequestVO alipayBlessingCardRequestVO = JSONObject.parseObject(decrypt, AlipayBlessingCardRequestVO.class); String type = alipayBlessingCardRequestVO.getType(); String userName = alipayBlessingCardRequestVO.getUid(); try { String timestamp = alipayBlessingCardRequestVO.getTimestamp(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(timestamp); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar timenowbefore = Calendar.getInstance(); Calendar timenowafter = Calendar.getInstance(); timenowafter.setTime(new Date()); // timenowafter.add(Calendar.SECOND,+10); timenowafter.add(Calendar.MINUTE,+30);//测试 timenowbefore.setTime(new Date()); // timenowbefore.add(Calendar.MINUTE,-1); timenowbefore.add(Calendar.MINUTE,-30); //测试 LoggerUtil.info("入参时间:"+calendar); LoggerUtil.info("时间要在timenowbefore后:"+timenowbefore); LoggerUtil.info("时间要在timenowafter前:"+timenowafter); if (calendar.after(timenowbefore) && calendar.before(timenowafter)){ LoggerUtil.info("三十分钟内传来的数据,继续执行正常逻辑"); //走领卡还是合成卡 if (PUMPCARD.equals(type)){ //抽福卡 //基本福卡数不超过8张 //抽福卡 有效卡 无效卡 //返回 responseVO = alipayArService.getCard(userName,type); return responseVO; } else if (SYNTHESISCARD.equals(type)){ //合成福卡 //该用户没有合成过福卡 //有4种不同的基本卡 //合成福卡 responseVO = alipayArService.synthesizeCard(userName,type); return responseVO; } else if (QUERYDETAILS.equals(type)) { //查询用户福卡明细 List<AlipayArUserCouponInfo> alipayArUserCouponInfoList= alipayArService.queryBlessingCardDetail(userName); responseVO.setResult(alipayArUserCouponInfoList); responseVO.setMessage("查询到用户福卡明细"); responseVO.setStatus(SUCCESS); return responseVO; } responseVO.setMessage("传入信息错误"); return responseVO; } else { LoggerUtil.info("时间戳在现有时间范围外"); responseVO.setStatus(FAIL); responseVO.setMessage("时间戳超过1分钟"); return responseVO; } } catch (Exception e) { LoggerUtil.error("福卡-优惠券-领取异常:",e); return alipayArService.receiveNoUseCard(userName); } } }
分别是领取福卡和转赠福卡,我和前端约定好用des算法加密,约定好一个字符串desKey将它配置到缓存中。前端传个json给我,json根据desKey解密后,转实体,
实体中有时间戳,判断当前时间戳在当前时间前后2,3分钟之内,等。这里就用到了token,为了,,,提高这个接口的安全性吧,。,好像我总结的不对。
session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失
token可以具体看一下我们的官网登录是怎么实现的
原文:https://www.cnblogs.com/woainixxx/p/11116589.html