日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

单点登录Redis存储Session及SessionId问题说明与集群实战-3

發布時間:2024/4/13 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单点登录Redis存储Session及SessionId问题说明与集群实战-3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
那現在我們就是要把sessionID的login請求,我們再看一下redis,回到我們的代碼,我們現在不請求localhost:8080了,我們要請求happymall.com,因為我們 已經把他配置了host,它會像我們讀取的網站一樣,一會請求tomcat1,一會請求tomcat2,那我們把這個名字改一下,我們把redis清空一下flushdb;keys *

這個時候我們請求打到tomcat2上,我們看一下writeLoginUser,進來,我們這個時候拿到的token是4B13k開頭的,這個token就是我們要存在redis里面的,并且domain一級域名下面的,然后放到response里面,addCookie,這個時候response還沒有返回,所以我們在瀏覽器里面,并且我們這個請求504超時了,504是nginx的超時時間,所以大家看到這個錯誤不要驚慌,這是正常的,我們可以去修改nginx的超時時間,很簡單的,因為我們現在主要是講這個方法的調試,然后我們read一下我們進去,讀取的cookie都有兩個,有什么,JSESSIONID,下面還有一個mmall_login_token

但這個58A1是什么,是我們之前把這個斷點,放過去,已經存到redis里的cookie,其實我們已經read過來了,我們可以看到已經返回了

繼續刪除loginToken,這里面也很簡單,進去之后各種判斷

然后把它set到redis里面keys *4B13就在這里面了

在這里要set一個,httpOnly,為true,那設置這個呢,是為了防止腳本攻擊,這個屬性規定,不允許通過腳本訪問cookie,在使用httpOnly這個cookie之后呢,斷點就能夠排除敏感信息,被發送給黑客的計算機,或者使用腳本的web斷點的可能性,那我們的代碼這樣設置之后,是無法通過腳本來獲取這個信息的,同時瀏覽器也不會把cookie,發送給任何第三方,這樣就保證了信息的安全,當然他無法全面的保障我們斷點的防止腳本攻擊的安全,但是能提高一定的安全性,那是因為我們用的tomcat7,默認是servlet3.0,屬性可以直接設置,如果使用tomcat6的話,那這個屬性要重新加用一下,tomcat6提供的servlet2.x,并不提供set方法,那之前的做法呢,就是把這個屬性設置在頭里,然后我們再說一下,domain和path之間的關系,我們直接在這里加上注釋,A.happymall.com,第二個B.happymall.com,第三個A.happymall.com/test/cc,第四個A.happymall.com/test/dd,第五個A.happymall.com/test,那現在對于這幾個斷點是這樣的,//X:domain=".happymmall.com"//a:A.happymmall.com cookie:domain=A.happymmall.com;path="/"//b:B.happymmall.com cookie:domain=B.happymmall.com;path="/"//c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc"//d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd"//e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test"A和B是二級域名,所以a拿不到b的cookie,因為他們是同級的,然后說c和d,能共享a的cookie,同樣的c和d呢,也能共享e的cookie,可以看一下test,e的cookie是這樣的,所以c和d也能共享e的cookie,他們能讀取到e的cookie,但是c拿不到d的,d拿不到c的,c和d也拿不到b的,那他們之間的關系就是這樣的,非常簡單,也很容易理解,那我們就把domain設置成一級域名,path就設置成根目錄下,這樣就比較通用,而且也比較簡單,那我們就要抱著發展的思想來看這個問題 private final static String COOKIE_DOMAIN = ".happymmall.com";private final static String COOKIE_NAME = "mmall_login_token";//X:domain=".happymmall.com"//a:A.happymmall.com cookie:domain=A.happymmall.com;path="/"//b:B.happymmall.com cookie:domain=B.happymmall.com;path="/"//c:A.happymmall.com/test/cc cookie:domain=A.happymmall.com;path="/test/cc"//d:A.happymmall.com/test/dd cookie:domain=A.happymmall.com;path="/test/dd"//e:A.happymmall.com/test cookie:domain=A.happymmall.com;path="/test"public static void writeLoginToken(HttpServletResponse response,String token){Cookie ck = new Cookie(COOKIE_NAME,token);ck.setDomain(COOKIE_DOMAIN);ck.setPath("/");//代表設置在根目錄ck.setHttpOnly(true);//單位是秒。//如果這個maxage不設置的話,cookie就不會寫入硬盤,而是寫在內存。只在當前頁面有效。ck.setMaxAge(60 * 60 * 24 * 365);//如果是-1,代表永久log.info("write cookieName:{},cookieValue:{}",ck.getName(),ck.getValue());response.addCookie(ck);} 還記得我們之前設置host的時候,當時是有一個user.happymall.com的,我們簡單說一下,那這個域名現在沒有啟用,如果要啟用的話呢,也是127.0.0.1,我們線上也沒有配置,隨著我們項目的不斷演進,我們價格的演進,那么在后續的時候,我們會把用戶相關的,登陸注冊,找回密碼,忘記密碼,重置密碼,獲取用戶信息,包括管理員的權限判斷,全部抽取出來一個單獨的服務,我們可以叫他用戶中心,那么這個時候我們這個服務呢,以現在我們這種寫法是可以通用的,例如我們把cookie是放在一級域名下的,那我們在user.happymall.com里面,那我們的user.happymall.com,這里面所有關于登陸所有session共享的,這些代碼也都是OK的,因為它能夠拿到這里面的cookie,那當然這是一個服務化的思想

那現在是打到TOMCAT2上

現在打到tomcat1上,我們再看一下cookie,JSESSIONID和剛才的tomcat2的不一樣,但是mmall_login_token,8B63,是一樣的,那我們在讀取用戶信息的時候,就那mmall_login_token這個value,去redis里面查,可以查到了,這樣無論是tomcat1還是tomcat2,都能讀到用戶信息

我們看一下redis里面

那這個就是用戶信息了,所以呢現在,我們這個cookie已經進入到一級域名下了,可以看到這個domain,這個就是我們設置的maxage,我們設置的是一年,那繼續來驗證他,我們還有一個get_user_info方法,獲取用戶信息,我們看看這個請求

在代碼里是POST請求,405 METHOD not allowed,這里我們要改成post,我們改成form,用戶未登錄,用戶無法獲取當前信息

為什么會報這個錯呢,很簡單,看一下我們的代碼,我們這里面還是在session里面去拿,那接下來我們就要改造他,就是從cookie拿到mmal_login_token,然后從redis里面獲取這個用戶信息,同時還能演示我們的readCookie @RequestMapping(value = "get_user_info.do",method = RequestMethod.POST)@ResponseBodypublic ServerResponse<User> getUserInfo(HttpServletRequest httpServletRequest){String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isEmpty(loginToken)){return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}String userJsonStr = RedisShardedPoolUtil.get(loginToken);User user = JsonUtil.string2Obj(userJsonStr,User.class);if(user != null){return ServerResponse.createBySuccess(user);}return ServerResponse.createByErrorMessage("用戶未登錄,無法獲取當前用戶的信息");}

?

總結

以上是生活随笔為你收集整理的单点登录Redis存储Session及SessionId问题说明与集群实战-3的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。