Redis解決跨域存取Session問題
前言
vue3+SpringBoot做項(xiàng)目時(shí),由于vue前端項(xiàng)目是在8080端口運(yùn)行,而后端項(xiàng)目是在8081端口運(yùn)行,前端通過跨域發(fā)送axios請(qǐng)求發(fā)送給后端的場(chǎng)景下,我以前在前后端不分離的情況下做項(xiàng)目登錄功能做過濾器時(shí),直接用Session就可以將用戶登錄的信息存到session中,過濾器只需要查看在攔截路徑時(shí)對(duì)session做獲取,獲取成功則說明可以用戶是登錄成功的。也不會(huì)出現(xiàn)session存不進(jìn)去的情況。
這次的前后端分離這個(gè)問題就出現(xiàn)了,下面就來解決這個(gè)問題。
一、遇到的情況
在登錄controller中的login方法里,登錄成功后將值存到session中
request.getSession().setAttribute("administrator",admin.getId());
但在頁面中打開f12,點(diǎn)開應(yīng)用會(huì)發(fā)現(xiàn)沒有存儲(chǔ)session的信息。

這就是跨域帶來的問題,后端服務(wù)器是8081端口,存session就存不到前端8080端口的session中。
二、解決問題
既然已經(jīng)知道了問題,在我發(fā)現(xiàn)這個(gè)問題時(shí)(因?yàn)槲褼ebug調(diào)試跟蹤后端代碼后發(fā)現(xiàn)確實(shí)執(zhí)行了存session的動(dòng)作,所以才會(huì)知道是跨域?qū)е碌膯栴})。我一開始就上網(wǎng)找材料,查找解決辦法。搜到的大部分都是在分布式的情況下共享session問題。不太符合解決我當(dāng)前遇到的問題。
查了一段時(shí)間資料后,我想到了Redis,想到了:存session、取session的過程,那能用session去存取數(shù)值,為什么不用Redis呢?這讓我“如魚得水“,在學(xué)習(xí)完Redis后還沒想到Redis可以用來代替session干活,哈哈。所以我將用Redis解決問題的步驟代碼分享給大家,學(xué)過Redis的應(yīng)該是屬于簡(jiǎn)單易懂的。
2.1 配置yml文件
在yml文件中配置Redis的基本信息。

2.2 啟動(dòng)Redis
將Redis服務(wù)器打開

2.3 代碼編寫
第一步:注入RedisTemplate
@Autowired private RedisTemplate redisTemplate;
第二步:將登錄成功的值存到Redis中
//6.登錄成功,將員工id存入Redis并返回登錄成功結(jié)果
redisTemplate.opsForValue().set("administrator",admin.getId());
第三步:在過濾器攔截路徑后取Redis中的值。當(dāng)然了,別忘了在過濾器類注入RedisTemplate。
//4-1.判斷登錄狀態(tài),如果已登錄,則直接放行
if(redisTemplate.opsForValue().get("administrator") != null){
/**
* 設(shè)置將id存起來
* */
Long adminId = (Long) redisTemplate.opsForValue().get("administrator");
BaseContext.setCurrentId(adminId);
//放行
filterChain.doFilter(request,response);
return;
}
三、效果演示
先打開Redis桌面管理查看值,在沒有登錄時(shí)是沒有值的。如下圖:

啟動(dòng)項(xiàng)目后我們登錄一下,查看Redis中是否有值。
登錄成功,在攔截器開的情況下也會(huì)發(fā)送axios請(qǐng)求查詢數(shù)據(jù)庫數(shù)據(jù)。所以已經(jīng)證明了。

但我們還是看下存到Redis的值,如下圖:

可以看到,已經(jīng)實(shí)現(xiàn)了這個(gè)功能。使用Redis代替了session起到的作用。所以攔截器自然也知道你是登錄過的,才會(huì)讓行讓方法能夠查詢數(shù)據(jù)庫將數(shù)據(jù)顯示到頁面去。
總結(jié)
到這里使用Redis就解決了Session存取存在的跨域問題,也不叫解決session的跨域問題吧,只是換了個(gè)思路解決了同樣的問題而已。我相信session也是可以解決這個(gè)問題的,應(yīng)該是需要配置一些前端的代碼等。我也不太清楚,但能用我們學(xué)習(xí)過的知識(shí)解決問題那不是更好嗎!Redis用起來也很簡(jiǎn)單,也解決了當(dāng)前的問題,我覺的是一個(gè)很不錯(cuò)的方法。
到此這篇關(guān)于Redis解決跨域存取Session問題的文章就介紹到這了,更多相關(guān)Redis跨域存取Session內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何自定義redis工具jar包供其他SpringBoot項(xiàng)目直接使用
這篇文章主要介紹了如何自定義redis工具jar包供其他SpringBoot項(xiàng)目直接使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Redis處理高并發(fā)機(jī)制原理及實(shí)例解析
這篇文章主要介紹了Redis處理高并發(fā)機(jī)制原理及實(shí)例解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值析,需要的朋友可以參考下2020-08-08
分布式Redis?Cluster集群搭建與Redis基本用法
這篇文章介紹了分布式Redis?Cluster集群搭建與Redis基本用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02

