當(dāng)前位置:
首頁(yè) >
单点登录Redis存储Session及SessionId问题说明与集群实战-1
發(fā)布時(shí)間:2024/4/13
44
豆豆
生活随笔
收集整理的這篇文章主要介紹了
单点登录Redis存储Session及SessionId问题说明与集群实战-1
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
斷點(diǎn)已經(jīng)到這兒了,sessionId我們看一下,sessionId是B218,我們把value copy一下
放到這里,然后讓Redis存上,key就是session的id,value就是user,后邊就是有效期,30分鐘,然后F8,我們檢查一下redis,先開(kāi)一個(gè)窗口,然后進(jìn)入redis,可以看到這個(gè)key已經(jīng)存在這里了,我們?cè)賕et一下,這里面就是user的登陸信息,這個(gè)沒(méi)有關(guān)系,存的是漢字,type一下,這個(gè)key是一個(gè)string,因?yàn)槲覀儼堰@個(gè)對(duì)象JSON序列話(huà)存在這里了,那我們看一下他的有效期,1759,還有1759秒,30分鐘,那第二次就變了,現(xiàn)在倒計(jì)時(shí),現(xiàn)在已經(jīng)把用戶(hù)信息存到這里了
然后我們繼續(xù)看,這塊非常重要,涉及的點(diǎn)也比較多,包括redis,cookie,還有我們的JAVA代碼,還有tomcat,一會(huì)我們還會(huì)把nginx加在這里,所以這里相對(duì)來(lái)說(shuō)比較復(fù)雜,那也正因?yàn)閺?fù)雜,難度高,所以對(duì)我們來(lái)說(shuō),才不能放棄,越是難的點(diǎn),我們?cè)揭料滦膩?lái),好好學(xué),這個(gè)就是彎車(chē)到,我們就要在這里超過(guò)別人,畢竟還是有門(mén)檻的,那我們繼續(xù),剛才就是給大家打打氣,咱們看一下,localhost,刷新一下,看一下,network刷新,看這里的請(qǐng)求,可以看到,他JESSIONID,正是我們拿的sessionId,在request-header里面
把這個(gè)也放過(guò)來(lái),放到這里,把前面的刪掉,可以看到呢,這兩個(gè)sessionId是一樣的
在Application里面,有一個(gè)cookie,點(diǎn)開(kāi)他,在這里可以看到,這里面的value也是sessionId,那這個(gè)就是JSESSIONID
那這個(gè)就是JSESSIONID,放到這里,可以看到呢,request里面這個(gè)sessionId,正是我們?cè)诤笈_(tái)拿到的sessionId,這個(gè)就是為了對(duì)比看一下,這個(gè)值是不是我們想要的,接下來(lái)因?yàn)槲覀円黾?那對(duì)tomcat1是OK了,每次他的JSESSIONID都是這個(gè),他的用戶(hù)信息也都能找到,根據(jù)這個(gè)JESSIONID,拿這個(gè)value也能拿到,那我們現(xiàn)在就要模擬集群的情況,我們?cè)匍_(kāi)一個(gè)TOMCAT2,但是IDEA不能同時(shí)打開(kāi)兩個(gè)窗口,就是說(shuō)對(duì)于同一個(gè)項(xiàng)目,在open的時(shí)候,沒(méi)有反應(yīng),那很簡(jiǎn)單,看一下,我們復(fù)制一下項(xiàng)目,tomcat2,然后再打開(kāi)他,現(xiàn)在我們就要多進(jìn)程debug了,我們有兩個(gè)進(jìn)程,把tomcat2用idea打開(kāi),這個(gè)是tomcat2,也放到這里,那tomcat2呢,肯定不能向tomcat1一樣,我們這里只要把它部署到tomcat2里面,我們新建一個(gè)tomcat,那這里也不需要新增了,我們把這個(gè)1改一下就可以了,但是重要的是這里,一定要把tomcat server改成tomcat2,然后是9080端口,然后啟動(dòng)tomcat2,在新的tomcat2里面debug啟動(dòng),這里報(bào)錯(cuò)了,是因?yàn)閞mi端口已經(jīng)在用了,我們修改一下
但是呢,這里強(qiáng)調(diào)一下,就是在我們tomcat里面,之前講的那三個(gè)端口,一定是已經(jīng)改好的狀態(tài),并且tomcat1和tomcat2都OK,那我們?cè)趩?dòng)tomcat2的時(shí)候,JMX端口改一下,同樣加一千,檢查一下,9080,2099,Tomcat2 OK,然后我們?cè)賳?dòng)一下debug,我們?cè)L問(wèn)一下,9080,8080和9080都訪問(wèn)上了,為了更清楚一點(diǎn)呢,我們把jsp也改一下,這個(gè)是tomcat2的,左邊這個(gè)是tomcat1的,然后我們刷新tomcat1和tomcat2,可以看到tomcat1報(bào)錯(cuò)了,然后我們把tomcat1重啟,因?yàn)槲覀儎倓傇趧?chuàng)建UserController的時(shí)候,加了一些代碼,這邊還是有改動(dòng)的,重啟一下tomcat1,然后訪問(wèn)一下tomcat1,那么tomcat2也重啟一下,tomcat2也啟動(dòng)了,從首頁(yè)很清楚的分辨出來(lái),那現(xiàn)在問(wèn)題來(lái)了,我們?cè)倏匆幌?因?yàn)閠omcat1剛剛重啟了,我們看一下他的network,可以看到JSSIONID已經(jīng)變了
也就是說(shuō)TOMCAT在重啟的時(shí)候,REQUEST里面的JSESSIONID,已經(jīng)改變,那我們之前登陸的呢,是白登陸了,因?yàn)樗膋ey是B218,不是456,那有的小伙伴可能會(huì)說(shuō),那我的服務(wù)放到現(xiàn)在就不重啟了,那這個(gè)JSESSIONID是不變的,對(duì),是這樣的,那就是說(shuō),那tomcat1登陸信息是有效地,我們假設(shè)這個(gè)是成立的,我們這個(gè)服務(wù)器永遠(yuǎn)不重啟,那我們繼續(xù),那我們自己來(lái)認(rèn)證,看一下tomcat2的,檢查,看一下TOMCAT2的JSESSIONID
B6A0肯定也不是我們這個(gè),那很簡(jiǎn)單,我們清空一下flushdbkeys *
操作給你看,同樣的,8080斷點(diǎn)肯定過(guò)來(lái)了
看一下Rediskeys *81B49
那這次請(qǐng)求的是81B49,TOMCAT1
再刷新一下,還是81B49,那81B49已經(jīng)存到REDIS里邊,沒(méi)有問(wèn)題
那現(xiàn)在的問(wèn)題是,因?yàn)槲覀兪且龀杉旱?那我們下次請(qǐng)求,請(qǐng)求到localhost 9080呢,刷新tomcat2,看一下tomcat2的JSESSIONID,存的是2B26
那我要說(shuō)的是,我們登錄在8080上,8080的session存到了redis服務(wù)器里,第二次請(qǐng)求,負(fù)載均衡到9080,而這里面的JSESSIONID,是另外一個(gè),那根據(jù)這個(gè)key,我們?cè)趓edis里,肯定是找不到的,那會(huì)認(rèn)為請(qǐng)求9080,認(rèn)為他沒(méi)有登錄,那我們繼續(xù)來(lái)測(cè)試,很簡(jiǎn)單,我們繼續(xù)開(kāi)一個(gè)端口,我們要干什么呢,打開(kāi)我們的nginx,然后請(qǐng)求localhost,nginx已經(jīng)啟動(dòng),現(xiàn)在我們開(kāi)始配置host,來(lái)模擬這個(gè)集群,進(jìn)一下conf,之前我們用的是imoc.com,這個(gè)就是我們的線上,做的這么一個(gè)電商的服務(wù),那我們?cè)诒镜亻_(kāi)發(fā)的時(shí)候,就開(kāi)始模擬了,很簡(jiǎn)單,我們把imoc.com.cnf,copy一份出來(lái),happymall.com.cnf,然后我們編輯他,那server就要改一下了,這里也是happymall.com,分別是8080和9080,這兩個(gè)權(quán)重都是1,然后接著往下看,那么servername也要改一下,請(qǐng)求happymall.com,然后proxy_mall改成happymall.com,上面的upstream也要改
我們把它置成bak,以bak為結(jié)尾就不會(huì)被加載進(jìn)來(lái)
現(xiàn)在只有這么一個(gè)配置文件,reload一下sudo ./nginx -s reload
然后編輯我們的hostvim /etc/hosts聰明的小伙伴呢,一定會(huì)想到,把這個(gè)打開(kāi),127.0.0.1指向happymall.com,那這里面我要講一個(gè)擴(kuò)展的知識(shí)點(diǎn),我們?cè)賹?xiě)一個(gè)127.0.0.1,user.happymall.com,很簡(jiǎn)單,我們的項(xiàng)目不斷演進(jìn),我們會(huì)把用戶(hù)中心單獨(dú)抽取出去,成立一個(gè)二級(jí)域名,user.happymall.com,所有關(guān)于登陸,權(quán)限,各種驗(yàn)證,都將走user.happymall.com,這個(gè)是為了以后演進(jìn),放到這里,做一個(gè)知識(shí)點(diǎn)擴(kuò)展,那首先還是關(guān)注我們的www,user會(huì)領(lǐng)著大家來(lái)測(cè)試,后邊使用cookie,操作cookie時(shí)候的一些操作
就得保存我們的host文件,然后ping一下ping www.happymal.com
ping一下user.happymall.com
雖然我們線上沒(méi)有user,這個(gè)二級(jí)子域名,但是我們一會(huì)演示cookie的時(shí)候,講解domain非常重要的一個(gè)知識(shí)點(diǎn),那我們繼續(xù),回到瀏覽器,那這個(gè)我們現(xiàn)在看到的網(wǎng)站,是在配置host,之前你所看到的網(wǎng)站,那請(qǐng)求的是一個(gè)正常的網(wǎng)站,那host已經(jīng)配置完了,我們?cè)僬?qǐng)求一下,看到還沒(méi)有生效,那我們清空一下瀏覽器,清除瀏覽器,再請(qǐng)求一下,這個(gè)時(shí)候已經(jīng)提示502,Gate way,沒(méi)關(guān)系,那我們可以把瀏覽器全部關(guān)閉之后,再重新reload一下,因?yàn)槲覀價(jià)eload是在配置,host之前,所以我們?cè)賠eload一下sudo ./nginx -s reload然后再刷新,OK,也就是說(shuō),我們配置完host,之前reload的,那為什么出現(xiàn)問(wèn)題呢,來(lái)一起來(lái)看一下,很簡(jiǎn)單,我們這個(gè)配置文件是這么寫(xiě)的,寫(xiě)的是happymall.com,并不是127.0.0.1:8080,happymall我們?cè)诩虞dnginx的時(shí)候,他并沒(méi)有指向127.0.0.1,因?yàn)槟莻€(gè)時(shí)候,host還沒(méi)配置,所以如果我們這個(gè)配置文件配置的是,域名這種方式,我們本地host一定要reload之前,配置好,并且使他生效,然后再reload nginx的配置,那或者還有一種方式,我們把server里面的節(jié)點(diǎn),配置成127.0.0.1:8080,因?yàn)樗遣恍枰ㄟ^(guò)host來(lái)進(jìn)行解析了,哪還有一種保守的方法,無(wú)論你這里面是配域名,還是127.0.0.1,我們?cè)趆ost修改完之后,都reload一下即可
同樣的還要注意,像window,linux,部分瀏覽器的版本,要清空瀏覽器的數(shù)據(jù),清除瀏覽器數(shù)據(jù),關(guān)閉所有的瀏覽器,重新打開(kāi),然后再重新請(qǐng)求,我們現(xiàn)在刷新一下,可以看到,這里面很明顯,一會(huì)tomcat1,一會(huì)tomcat2,因?yàn)槲覀兪怯袡?quán)重的,那現(xiàn)在問(wèn)題來(lái)了,現(xiàn)在域名請(qǐng)求happymall.com,我們?cè)僬?qǐng)求一個(gè),user.happymall.com,這個(gè)呢因?yàn)槲覀儧](méi)有配置nginx配置,他就跳到本地localhost,80端口,正常的,這個(gè)呢也生效了,那一會(huì)我們要講一下,我們繼續(xù),那現(xiàn)在請(qǐng)求happymall.com,就是剛剛說(shuō)的,登陸sessionId的問(wèn)題,TOMCAT1和TOMCAT2,登陸的時(shí)候在tomcat1上,sessionId我們也存到redis里面,但是下次請(qǐng)求的時(shí)候,我們?cè)诰€上肯定是用域名的方式,當(dāng)我們登陸完之后,在tomcat2請(qǐng)求的時(shí)候,并不會(huì)拿到登陸的信息,因?yàn)閠omcat2的JSESSIONID,肯定不是TOMACT1的JSESSIONID,可以看一下,這塊呢我們用了nginx,兩個(gè)tomcat打開(kāi)了兩個(gè)IDEA,然后配置了host,配置了nginx的反向代理,然后又講解了redis,現(xiàn)在問(wèn)題已經(jīng)說(shuō)明白了,那我們現(xiàn)在就要推翻之前的假設(shè),之前的假設(shè)是說(shuō),我這個(gè)服務(wù)器到線上肯定不重啟,那我們既然要做集群,肯定不是一臺(tái)服務(wù)器,即使你TOMCAT1不重啟,我請(qǐng)求你這個(gè)域名的時(shí)候,還是有可能把請(qǐng)求打到TOMCAT2,TOMCAT3,TOMCAT4上,所以你不重啟TOMCAT1,想保證session信息也被推翻了,當(dāng)然不可能不重啟,難道你的網(wǎng)站不更新了,問(wèn)題顯而易見(jiàn),那么我們現(xiàn)在就來(lái)搞定他
?
總結(jié)
以上是生活随笔為你收集整理的单点登录Redis存储Session及SessionId问题说明与集群实战-1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单点登录Redis存储Session及C
- 下一篇: 单点登录Redis存储Session及S