雖然你的離開并不是因?yàn)樵?jīng)的我一無(wú)所有,但你離開后我就發(fā)現(xiàn)曾經(jīng)的我其實(shí)一無(wú)所有。
我知道,這就是這個(gè)世界的規(guī)則,所有的東西都在改變,而我要么低調(diào)地出局,要么慢慢地出眾。

思考.jpg
公司的一般用于H5做小程序,比如微信小游戲,其中Cookie主要用于標(biāo)記用戶的狀態(tài)以及一些基礎(chǔ)信息。
比如用戶登錄后,可以將Cookie放入瀏覽器,下次進(jìn)來(lái)如果Cookie沒有失效就不用再次進(jìn)行身份驗(yàn)證了,這也是很多需要登錄的網(wǎng)站中 記住密碼 這個(gè)功能的實(shí)現(xiàn)原理。
下面舉個(gè)小李子:
- 用戶登入時(shí)
/**
* 開始界面 aid是活動(dòng)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();
//....
}
}
用戶注冊(cè)時(shí):
/**
* 填寫用戶信息
* @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天的存活時(shí)間
response.addCookie(cookie);
}
主要是記錄一下用法,之前同事負(fù)責(zé)的H5小游戲開發(fā)的時(shí)候遇到的就是用戶操作無(wú)法和具體活動(dòng)綁定的問題,后來(lái)是使用Cookie 同時(shí)將aid作為key做第一層綁定來(lái)加避免每次進(jìn)入游戲都要進(jìn)行校驗(yàn)。
同時(shí)我也在我的項(xiàng)目中嘗試了用簡(jiǎn)單的封裝(這里省去密文傳輸部分)
@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");
/**
* 最總結(jié)果封裝
*/
if (empInfoDO != null) {
/**
* 校驗(yàn)成功,且還未抽獎(jiǎng)
*/
map.put("empInfo", EntityUtils.transform(empInfoDO, EmpInfoBO.class));
/**
* 校驗(yàn)成功,且抽過獎(jiǎng)
*/
if (awardInfoDO != null) {
map.put("awardInfo", EntityUtils.transform(awardInfoDO, AwardInfoBo.class));
//嘗試將數(shù)據(jù)放入Cookie
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, map));
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, map);
}
log.info("身份驗(yàn)證通過empInfo={},獎(jiǎng)品信息為awardInfo={}", empInfoDO, awardInfoDO);
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AND_NEVER_LOTTERY, map));
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AND_NEVER_LOTTERY, map);
}
log.info("身份驗(yàn)證失敗empInfo={},獎(jiǎng)品信息為awardInfo={}", empInfoDO);
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_FAILURE, map));
return ResultUtil.formatResponse(MobileStatusCode.AUTHENTICATION_FAILURE);
}
/**
* 員工抽獎(jiǎng)
*/
@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; //獎(jiǎng)品信息
EmpAwardResult empAwardResult = null; //返回的抽獎(jiǎng)結(jié)果
/**
* 活動(dòng) 規(guī)則 安全性 校驗(yàn)
*/
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, "沒有這個(gè)職員的信息",map);
}
if(awardInfoDO!=null){
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, "該職員已經(jīng)抽獎(jiǎng)",map);
}
/**
* 開始抽獎(jiǎng)
*/
AwardInfoDO step1 = null; //step1 同步到數(shù)據(jù)庫(kù)
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){//雙重檢測(cè)
return ResultUtil.formatResponse(MobileStatusCode.VALIDATED_AlLREADY_LOTTERY, "該職員已經(jīng)抽獎(jiǎng)");
}
try{
empAwardResult = new EmpAwardResult();
awardInfoDO = LotteryUtil.lottery(empInfoDO.getEmpNo());
step1 = awardService.addAwardId(awardInfoDO);//加入到數(shù)據(jù)庫(kù)
step2 = lotteryCache.addAwardInfoKeyEmpNo(awardInfoDO);//加入到緩存
} finally {
//釋放鎖
redisLockService.unLock(EMP_LOTTY_LOCK);
}
if(step1==null||step2==null){
log.error("抽獎(jiǎng)操作失敗 step1(加入到數(shù)據(jù)庫(kù))={},step2(加入到緩存)={}");
}
empAwardResult.setEmpAwardResult(awardInfoDO,empInfoDO);
log.info("抽獎(jiǎng)操作成功 step1(加入到數(shù)據(jù)庫(kù))={},step2(加入到緩存)={},empAwardResult={}",step1,step2);
map.put("empAwardResult", empAwardResult);
//嘗試將數(shù)據(jù)放入Cookie
setToCookie(XXX,ResultUtil.formatResponse(MobileStatusCode.OPERATE_SUCCESS, "抽獎(jiǎng)成功", map));
return ResultUtil.formatResponse(MobileStatusCode.OPERATE_SUCCESS, "抽獎(jiǎng)成功", 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天的存活時(shí)間
getResponse().addCookie(cookie);
}
成功將請(qǐng)求響應(yīng)速度加快了將近一半的速度 77-38=39 毫秒。
第一次請(qǐng)求:

4051767-56e5ede69d5b921a.png
第二次請(qǐng)求:

image.png
了解更多有關(guān)于Cookie的內(nèi)容可以參考:[Cookie總結(jié)(http://www.itdecent.cn/p/49c8d2c27feb)