Redis?+?Java攔截器實現(xiàn)用戶匿名和非匿名訪問
該篇文章以《Redis實現(xiàn)短信驗證碼登錄》這篇文章為基礎(chǔ),以Redis和Java攔截器為核心,對登錄功能展開研究和應(yīng)用。
需求
- 對所有的接口按需分類
- 一些接口可以匿名訪問
- 一些接口必須登錄才可以訪問
- 刷新token
實現(xiàn)截圖
獲取驗證碼

用驗證碼完成登錄,并獲取token

用token實現(xià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) {
// 沒有,需要攔截,設(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攔截器實現(xiàn)用戶匿名和非匿名訪問的文章就介紹到這了,更多相關(guān)Redis Java用戶匿名和非匿名訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java識別一篇文章中某單詞出現(xiàn)個數(shù)的方法
這篇文章主要介紹了java識別一篇文章中某單詞出現(xiàn)個數(shù)的方法,涉及java字符解析操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
SpringBoot整合Retry實現(xiàn)錯誤重試過程逐步介紹
重試的使用場景比較多,比如調(diào)用遠(yuǎn)程服務(wù)時,由于網(wǎng)絡(luò)或者服務(wù)端響應(yīng)慢導(dǎo)致調(diào)用超時,此時可以多重試幾次。用定時任務(wù)也可以實現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個注解搞定所有,感興趣的可以了解一下2023-02-02
SpringBoot無法識別bootstrap.yml小綠葉問題的解決辦法
一般單獨使用?Spring?Boot?時,bootstrap.yml?文件一般是不會生效的,也就是沒有小綠葉圖標(biāo),本文給大家介紹了SpringBoot無法識別bootstrap.yml小綠葉問題的解決辦法,文中給出了兩種解決方案,需要的朋友可以參考下2024-07-07
使用Springboot自定義注解,支持SPEL表達(dá)式
這篇文章主要介紹了使用Springboot自定義注解,支持SPEL表達(dá)式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Mybatis-Plus實現(xiàn)用戶ID自增出現(xiàn)的問題解決
項目基于 SpringBoot + MybatisPlus 3.5.2 使用數(shù)據(jù)庫自增ID時, 出現(xiàn)重復(fù)鍵的問題,本文就來介紹一下解決方法,感興趣的可以了解一下2023-09-09
Java構(gòu)造函數(shù)里的一些坑記錄super()和this()
這篇文章主要介紹了Java構(gòu)造函數(shù)里的一些坑記錄super()和this(),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

