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)文章
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java實現(xiàn)刪除排序數(shù)組中重復(fù)元素的方法小結(jié)【三種方法比較】
這篇文章主要介紹了Java實現(xiàn)刪除排序數(shù)組中重復(fù)元素的方法,結(jié)合實例形式對比分析了三種常見的數(shù)組元素刪除算法操作技巧,需要的朋友可以參考下2019-02-02

