Redis實(shí)戰(zhàn)-session共享之修改登錄攔截器

在上一篇中Redis實(shí)戰(zhàn)之session共享檐蚜,我們知道了通過Redis實(shí)現(xiàn)session共享了魄懂,那么token怎么續(xù)命呢?怎么刷新用戶呢闯第?本來咱們就通過攔截器來實(shí)現(xiàn)這兩個(gè)功能市栗。

登錄攔截器優(yōu)化:

先來看看現(xiàn)在攔截器情況:

6e649d0b148042138a07e16e7677f4df.png

攔截流程:

當(dāng)攔截器攔截需要攔截到的url時(shí)候,才會(huì)在攔截器中更新用戶token的過期時(shí)間咳短。那如果填帽,訪問了不被攔截的路徑,就不會(huì)給token續(xù)命的诲泌。這樣就會(huì)導(dǎo)致用戶token過期盲赊,而重新登錄的。這樣是不對(duì)的敷扫。

攔截了哪些路徑哀蘑?在config/MvcConfig中

303aefeaefa995213ab88207d6a21c37.png

當(dāng)訪問以上這些路徑的是,就不會(huì)自動(dòng)更新用戶的token過期時(shí)間了葵第。

優(yōu)化:我們可以在現(xiàn)有攔截器簽名價(jià)格攔截器:

915557733da7a2752022aeb98d4dddd0.png

將獲取用戶绘迁,存放threadLocal及刷新token放到新的攔截器中。

第一個(gè)攔截器就叫做:刷新token攔截器卒密;第二個(gè)攔截器就叫做:用戶攔截器

創(chuàng)建刷新token的攔截器:

<pre class="brush:as3;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">import cn.hutool.core.bean.BeanUtil;
import com.hmdp.dto.UserDTO;
import com.hmdp.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static com.hmdp.constants.RedisConstants.LOGIN_USER_TOKEN_KEY;
import static com.hmdp.constants.RedisConstants.LOGIN_USER_TOKEN_TTL;

/**

  • @author 凱哥Java

  • @description 刷新用戶token的爛機(jī)器

  • @company
    */
    public class RefreshTokenInterceptor implements HandlerInterceptor {

    private StringRedisTemplate stringRedisTemplate;

    /**

    • 因?yàn)檫@個(gè)類不能被spring管理缀台,所以不能直接注入RedisTemplate對(duì)象。通過構(gòu)造函數(shù)傳遞
    • @param stringRedisTemplate
      */
      public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {
      this.stringRedisTemplate = stringRedisTemplate;
      }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //1:從請(qǐng)求中獲取到token
    String token = request.getHeader("authorization");
    if (StringUtils.isEmpty(token)) {
    return true;
    }
    //2:基于token獲取redis中用戶對(duì)象
    String key = LOGIN_USER_TOKEN_KEY + token;
    Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);
    //3:判斷
    if (userMap.isEmpty()) {
    return true;
    }
    //將map轉(zhuǎn)對(duì)象
    UserDTO user = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);
    UserHolder.saveUser(user);
    //刷新token的過期時(shí)間
    stringRedisTemplate.expire(key, LOGIN_USER_TOKEN_TTL, TimeUnit.MINUTES);
    return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    UserHolder.removeUser();
    }
    }
    </pre>

修改用戶攔截器:

<pre class="brush:as3;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">import com.hmdp.utils.UserHolder;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • @author 凱哥Java

  • @description 登錄攔擊器

  • @company
    */
    public class UserInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //判斷是否需要攔截
    if (UserHolder.getUser() == null) {
    response.setStatus(401);
    return false;

     }
     return true;
    

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    UserHolder.removeUser();
    }
    }
    </pre>

修改MvcCofig哮奇。將兩個(gè)攔截器添加進(jìn)去膛腐,并設(shè)置攔截順序:

<pre class="brush:as3;toolbar:false" style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(248, 248, 248);">import com.hmdp.interceptor.RefreshTokenInterceptor;
import com.hmdp.interceptor.UserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;

/**

  • @author 凱哥Java

  • @description mvn的配置-添加攔截器

  • @company
    */
    @Configuration
    public class MvcConfig implements WebMvcConfigurer {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    //登錄攔截器
    registry.addInterceptor(new UserInterceptor())
    .excludePathPatterns(
    "/shop/",
    "/voucher/
    ",
    "/shop-type/",
    "/upload/
    ",
    "/blog/hot",
    "/user/code",
    "/user/login"
    ).order(1);
    //刷新token攔截器
    registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
    }
    }
    </pre>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鼎俘,隨后出現(xiàn)的幾起案子哲身,更是在濱河造成了極大的恐慌,老刑警劉巖贸伐,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勘天,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捉邢,警方通過查閱死者的電腦和手機(jī)脯丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伏伐,“玉大人宠进,你說我怎么就攤上這事∶牯幔” “怎么了砰苍?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵潦匈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我赚导,道長(zhǎng)茬缩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任吼旧,我火速辦了婚禮凰锡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圈暗。我一直安慰自己掂为,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布员串。 她就那樣靜靜地躺著勇哗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寸齐。 梳的紋絲不亂的頭發(fā)上欲诺,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音渺鹦,去河邊找鬼扰法。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毅厚,可吹牛的內(nèi)容都是我干的塞颁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼吸耿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祠锣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咽安,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤伴网,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后板乙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是偷,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拳氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年募逞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋评。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡放接,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出留特,到底是詐尸還是另有隱情纠脾,我是刑警寧澤玛瘸,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站苟蹈,受9級(jí)特大地震影響糊渊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慧脱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一渺绒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菱鸥,春花似錦宗兼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鹊漠,卻和暖如春主到,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贸呢。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工镰烧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞陷。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓怔鳖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親固蛾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子结执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容