關(guān)于Cookie的妙用

雖然你的離開并不是因?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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 元旦前微信跳一跳H5小游戲火了,而在短短一兩天時(shí)間,跳一跳“小游戲”已經(jīng)刷屏。 這個(gè)游戲的玩法非常簡(jiǎn)單,手指長(zhǎng)按屏...
    讓代碼飛閱讀 780評(píng)論 0 0
  • 繼續(xù)這一個(gè)系列,基于Token的WEB后臺(tái)登錄認(rèn)證機(jī)制(并講解cookie和session機(jī)制)。每個(gè)后端不得不解...
    JackFrost_fuzhu閱讀 18,580評(píng)論 11 80
  • 本來(lái)想放Eason翻唱的《傾城》。你們懂的,林夕領(lǐng)進(jìn)門,皈依黃偉文。那前奏響起于我而言就像那些炒房客聽說雄安的千年...
    Allensays閱讀 561評(píng)論 0 1
  • 去B站看張繼科以前的那種正式比賽的視頻 發(fā)現(xiàn)彈幕很少 在那種張繼科和馬龍cp 張繼科和劉詩(shī)雯 丁寧 cp的視頻彈幕...
    STAYSOOBER閱讀 507評(píng)論 0 0
  • 簡(jiǎn)介:立足福建,拓展客戶結(jié)構(gòu)和服務(wù)區(qū)域 公司是福建省內(nèi)綜合實(shí)力較強(qiáng)的通信網(wǎng)絡(luò)維護(hù)服務(wù)企業(yè)之一,近年來(lái)服務(wù)區(qū)域逐步拓...
    suuue閱讀 341評(píng)論 1 0

友情鏈接更多精彩內(nèi)容