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可以具体看一下我们的官网登录是怎么实现的
一句话结尾
cookie是保存在本地终端的数据
session是保存在服务器的数据,并且会话结束后会销毁,同时它还会面临web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
token是用CPU计算时间获取了session 存储空间,无状态
cookie的组成
token的组成
cookie的组成有:名称(key)、值(value)、有效域(domain)、路径(域的路径,一般设置为全局:"")、失效时间、安全标志(指定后,cookie只有在使用SSL连接时才发送到服务器(https))。
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)
cookie和session的区别
实例 登录的时候账户密码我们用的cookie
淘宝网站,购物车中的物品我们可能用的session,且对他们做了数据的存储,下次登录我们的账户,购物车中的东西还在。
https://blog.csdn.net/qq_41802128/article/details/82151490
cookie 和session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
token
1.无状态、可扩展
2.支持移动设备
3.跨程序调用
4.安全