Redis?+?Java攔截器實(shí)現(xiàn)用戶匿名和非匿名訪問(wèn)
該篇文章以《Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄》這篇文章為基礎(chǔ),以Redis和Java攔截器為核心,對(duì)登錄功能展開(kāi)研究和應(yīng)用。
需求
- 對(duì)所有的接口按需分類
- 一些接口可以匿名訪問(wèn)
- 一些接口必須登錄才可以訪問(wèn)
- 刷新token
實(shí)現(xiàn)截圖
獲取驗(yàn)證碼
用驗(yàn)證碼完成登錄,并獲取token
用token實(shí)現(xiàn)訪問(wèn)非匿名訪問(wèn)接口
核心代碼
WebMvcConfigurer
/** * @author issavior */ @Configuration public class MyWebMvcConfigurer implements WebMvcConfigurer { @Autowired private RedisTemplate<String, Object> redisTemplate; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RefreshTokenInterceptor(redisTemplate)) .addPathPatterns("/**").order(0); registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/user/pay").order(1); } }
HandlerInterceptor
刷新token、添加和移除用戶信息到Threadlocal、
/** * @author issavior */ @Slf4j public class RefreshTokenInterceptor implements HandlerInterceptor { private final RedisTemplate<String, Object> redisTemplate; public RefreshTokenInterceptor(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("authToken"); if (StrUtil.isBlank(token)) { return true; } String key = "token:"+token; Issa issa = (Issa)redisTemplate.opsForValue().get(key); if (issa == null) { return true; } UserHolder.saveUser(issa); redisTemplate.expire(key, 60, TimeUnit.SECONDS); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { UserHolder.removeUser(); } }
判斷用戶是否有權(quán)限
/** * @author issavior */ public class MyHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1.判斷是否需要攔截(ThreadLocal中是否有用戶) if (UserHolder.getUser() == null) { // 沒(méi)有,需要攔截,設(shè)置狀態(tài)碼 response.setStatus(401); // 攔截 return false; } // 有用戶,則放行 return true; } }
ThreadLocal
/** * @author issavior */ public class UserHolder { private static final ThreadLocal<Issa> tl = new ThreadLocal<>(); public static void saveUser(Issa user){ tl.set(user); } public static Issa getUser(){ return tl.get(); } public static void removeUser(){ tl.remove(); } }
到此這篇關(guān)于Redis + Java攔截器實(shí)現(xiàn)用戶匿名和非匿名訪問(wèn)的文章就介紹到這了,更多相關(guān)Redis Java用戶匿名和非匿名訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java實(shí)現(xiàn)在Word指定位置插入分頁(yè)符
在Word插入分頁(yè)符可以在指定段落后插入,也可以在特定文本位置處插入。本文將以Java代碼來(lái)操作以上兩種文檔分頁(yè)需求,需要的可以參考一下2022-04-04Sentinel熱點(diǎn)key限流的實(shí)現(xiàn)詳解
這篇文章主要介紹了Sentinel熱點(diǎn)key限流的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java實(shí)現(xiàn)刪除排序數(shù)組中重復(fù)元素的方法小結(jié)【三種方法比較】
這篇文章主要介紹了Java實(shí)現(xiàn)刪除排序數(shù)組中重復(fù)元素的方法,結(jié)合實(shí)例形式對(duì)比分析了三種常見(jiàn)的數(shù)組元素刪除算法操作技巧,需要的朋友可以參考下2019-02-02