1. 程式人生 > 其它 >設定session與Cookie

設定session與Cookie

在分散式中 多個服務一般分別部署在不同的伺服器中 不同的伺服器因為作用域不同無法共享session
為了解決這一問題 可以自己生成一個token 訪問服務時 判斷token是否合法 如果合法則放行
只有token是無法識別使用者的 所以還得儲存一個UserId
在本專案中似乎未驗證token 只要不為空就可以通過 似乎不安全 可以新增驗證操作

這段程式碼首先判斷使用者狀態碼是否為空 之前因為沒有設定使用者而無法通過 除錯半天
然後判斷使用者狀態是否已凍結
之後生成uuid作為使用者token 設定到cookie中

        if (appUser.getActiveStatus() != null && !appUser.getActiveStatus().equals(UserStatus.FROZEN.type)) {
            // 將token儲存至redis中
            String uToken = UUID.randomUUID().toString();
            redisOperator.set(REDIS_USER_TOKEN + ":" + appUser.getId(), uToken);

            setCookie(request, response, "utoken", uToken, COOKIE_AGE);
            setCookie(request, response, "uid", appUser.getId(), COOKIE_AGE);
        }

設定cookie可能在別的controller中也要使用 所以可以抽到baseController中
在添加個 REDIS_USER_TOKEN 欄位作為token的key
setDomain 設定域
setPath("/") 設定路徑 imoocnews.com 下的所以域名都可以訪問

    protected static final Integer COOKIE_AGE = 30 * 60 * 60;

    protected void setCookie(HttpServletRequest request,
                             HttpServletResponse response,
                             String key, String value, Integer maxAge)  {
        String encoderKey = URLEncoder.encode(key, StandardCharsets.UTF_8);
        setCookieValue(request, response, encoderKey, value, maxAge);

    }

    protected void setCookieValue(HttpServletRequest request,
                                  HttpServletResponse response,
                                  String key, String value, Integer maxAge) {
        Cookie cookie = new Cookie(key, value);
        cookie.setMaxAge(maxAge);
        cookie.setDomain("imoocnews.com");
        cookie.setPath("/");

        response.addCookie(cookie);
    }

最後將登入或註冊完成將驗證碼從redis中刪除 並將帳號狀態返回

        redisOperator.del(MOBILE_SMS_CODE + ":" + mobile);

        return GraceJSONResult.ok(appUser.getActiveStatus());