虽然你的离开并不是因为曾经的我一无所有,但你离开后我就发现曾经的我其实一无所有。
我知道,这就是这个世界的规则,所有的东西都在改变,而我要么低调地出局,要么慢慢地出众。
公司的一般用于H5做小程序,比如微信小游戏,其中Cookie主要用于标记用户的状态以及一些基础信息。
比如用户登录后,可以将Cookie放入浏览器,下次进来如果Cookie没有失效就不用再次进行身份验证了,这也是很多需要登录的网站中 记住密码 这个功能的实现原理。
下面举个小李子:
- 用户登入时
/**
* 开始界面 aid是活动id
* @return
*/
@RequestMapping(value ="/index")
public String indexPage(Model model,HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(request.getCookies()==null){
return "mobile/index";
}
for(Cookie cookie : cookies){
if(cookie.getName().equals(webPlatformConfig.getAid())){
Map<String,Object> resultMap = new HashMap<>();
String tel = cookie.getValue();
//....
}
}
用户注册时:
/**
* 填写用户信息
* @param player
* @param response
* @return
*/
@RequestMapping(value = "/register",method={RequestMethod.POST})
@ResponseBody
public Result register(Player player,String validateCode,HttpServletResponse response){
Cookie cookie = new
Cookie(webPlatformConfig.getAid(),player.getTelephone());
cookie.setMaxAge(5*24*60*60);//5天的存活时间
response.addCookie(cookie);
}
主要是记录一下用法,之前同事负责的H5小游戏开发的时候遇到的就是用户操作无法和具体活动绑定的问题,后来是使用Cookie 同时将aid作为key做第一层绑定来加避免每次进入游戏都要进行校验。
同时我也在我的项目中尝试了用简单的封装(这里省去密文传输部分)
@ResponseBody
@RequestMapping(value = "/verify", method = RequestMethod.POST)
public Result empVerification(@RequestParam(value = "XXX",required = true) String XXX) {
if(StringUtils.isBlank(XXX)){
return ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_PARAM_ERROR);
}
String result = checkFromCookie(XXX);
if(result!=null){
return new Gson().fromJson(result,Result.class);
}
Map<String, Object> map = Maps.newHashMap();
AwardInfoDO awardInfoDO = null;
EmpInfoDO empInfoDO = null;
empInfoDO = (EmpInfoDO) getEmpAndAward(XXX).get("empInfoDO");
awardInfoDO = (AwardInfoDO) getEmpAndAward(XXX).get("awardInfoDO");
/**
* 最总结果封装
*/
if (empInfoDO != null) {
/**
* 校验成功,且还未抽奖
*/
map.put("empInfo", EntityUtils.transform(empInfoDO, EmpInfoBO.class));
/**
* 校验成功,且抽过奖
*/
if (awardInfoDO != null) {
map.put("awardInfo", EntityUtils.transform(awardInfoDO, AwardInfoBo.class));
//尝试将数据放入Cookie
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, map));
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, map);
}
log.info("身份验证通过empInfo={},奖品信息为awardInfo={}", empInfoDO, awardInfoDO);
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AND_NEVER_LOTTERY, map));
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AND_NEVER_LOTTERY, map);
}
log.info("身份验证失败empInfo={},奖品信息为awardInfo={}", empInfoDO);
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_FAILURE, map));
return ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_FAILURE);
}
/**
* 员工抽奖
*/
@ResponseBody
@RequestMapping(value = "/lottery", method = RequestMethod.POST)
public Result emplottery(@RequestParam(value = "XXX",required = true) String XXX) {
if(StringUtils.isBlank(XXX)){
return ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_PARAM_ERROR);
}
Map<String, Object> map = Maps.newHashMap();
EmpInfoDO empInfoDO = null; //员工信息
AwardInfoDO awardInfoDO = null; //奖品信息
EmpAwardResult empAwardResult = null; //返回的抽奖结果
/**
* 活动 规则 安全性 校验
*/
empInfoDO = (EmpInfoDO) getEmpAndAward(XXX).get("empInfoDO");
awardInfoDO = (AwardInfoDO) getEmpAndAward(XXX).get("awardInfoDO");
map.put("empInfoDO",empInfoDO);
map.put("awardInfoDO",awardInfoDO);
if(empInfoDO==null){
return ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_FAILURE, "没有这个职员的信息",map);
}
if(awardInfoDO!=null){
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, "该职员已经抽奖",map);
}
/**
* 开始抽奖
*/
AwardInfoDO step1 = null; //step1 同步到数据库
AwardInfoDO step2 = null; //step2 同步到缓存
boolean flag = false;
lebal:if(!redisLockService.tryLock(EMP_LOTTY_LOCK)){ //加锁控制
break lebal;
}
awardInfoDO = (AwardInfoDO) getEmpAndAward(XXX).get("awardInfoDO");
if(awardInfoDO!=null){//双重检测
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, "该职员已经抽奖");
}
try{
empAwardResult = new EmpAwardResult();
awardInfoDO = LotteryUtil.lottery(empInfoDO.getEmpNo());
step1 = awardService.addAwardId(awardInfoDO);//加入到数据库
step2 = lotteryCache.addAwardInfoKeyEmpNo(awardInfoDO);//加入到缓存
} finally {
//释放锁
redisLockService.unLock(EMP_LOTTY_LOCK);
}
if(step1==null||step2==null){
log.error("抽奖操作失败 step1(加入到数据库)={},step2(加入到缓存)={}");
}
empAwardResult.setEmpAwardResult(awardInfoDO,empInfoDO);
log.info("抽奖操作成功 step1(加入到数据库)={},step2(加入到缓存)={},empAwardResult={}",step1,step2);
map.put("empAwardResult", empAwardResult);
//尝试将数据放入Cookie
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.OPERATE_SUCCESS, "抽奖成功", map));
return ResultUtil.formatResponse(MobileStatusCode.OPERATE_SUCCESS, "抽奖成功", map);
}
/**
* 从Cookie检查
* @param idCard
* @return
*/
public String checkFromCookie (String XXX){
Cookie[] cookies = getRequest().getCookies();
if(cookies!=null){
for(Cookie cookie : cookies){
if(cookie.getName().equals(idCard)){
return cookie.getValue();
}
}
}
return null;
}
/**
* 放入Cookie
* @param result
* @return
*/
public void setToCookie (String XXX,Result result){
Cookie cookie = new Cookie(idCard,new Gson().toJson(result));
cookie.setMaxAge(1*12*60*60);//5天的存活时间
getResponse().addCookie(cookie);
}
成功将请求响应速度加快了将近一半的速度 77-38=39 毫秒。
第一次请求:
第二次请求:
了解更多有关于Cookie的内容可以参考:[Cookie总结(https://www.jianshu.com/p/49c8d2c27feb)