設定session與Cookie
阿新 • • 發佈:2021-07-22
在分散式中 多個服務一般分別部署在不同的伺服器中 不同的伺服器因為作用域不同無法共享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());