日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UserThreadLocal 用户线程Token拦截验证

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UserThreadLocal 用户线程Token拦截验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

注冊攔截器

package com.tanhua.server.config;import com.tanhua.server.interceptor.RedisCacheInterceptor; import com.tanhua.server.interceptor.UserTokenInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 配置過濾器*/ @Configuration public class WebConfig implements WebMvcConfigurer {/*** redis 緩存檢測*/@Autowiredprivate RedisCacheInterceptor redisCacheInterceptor;/*** token檢測*/@Autowiredprivate UserTokenInterceptor userTokenInterceptor;/*** 過濾器鏈 根據順序攔截** @param registry 注冊過濾器鏈 根據順序攔截*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(this.userTokenInterceptor).addPathPatterns("/**");registry.addInterceptor(this.redisCacheInterceptor).addPathPatterns("/**");} }

編寫用戶線程工具類

package com.tanhua.common.utils;import com.tanhua.common.pojo.User;/*** 當前用戶線程*/ public class UserThreadLocal {private UserThreadLocal() {}private static final ThreadLocal<User> LOCAL = new ThreadLocal<>();/*** 將user放到threadLocal** @param user user*/public static void setUser(User user) {LOCAL.set(user);}/*** 返回當前線程中的user對象** @return 返回當前線程中的user對象*/public static User getUser() {return LOCAL.get();}/*** 刪除當前線程中的user對象*/public static void remove() {LOCAL.remove();} } 定義標記不需要驗證token 的注解 package com.tanhua.common.utils;import java.lang.annotation.*;/*** 標記不需要驗證token 的方法*/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented //標記注解 public @interface NoAuthorization { }

攔截器

package com.tanhua.server.interceptor;import com.tanhua.common.pojo.User; import com.tanhua.common.utils.NoAuthorization; import com.tanhua.common.utils.UserThreadLocal; import com.tanhua.server.service.UserService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 攔截 效驗token*/ @Component public class UserTokenInterceptor implements HandlerInterceptor {@Autowiredprivate UserService userService;//將user對象放入threadLocal@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//效驗handler 是否為匹配到controller的方法if (!(handler instanceof HandlerMethod)) {return true;}//判斷方法是否包含了NoAuthorization注解, 標記不需要驗證TOKENif (((HandlerMethod) handler).hasMethodAnnotation(NoAuthorization.class)) {return true;}//獲取請求keyString token = request.getHeader("Authorization");if (StringUtils.isNotEmpty(token)) {//調用sso 驗證 token 的有效性User user = userService.queryUserByToken(token);if (null != user) {UserThreadLocal.setUser(user);return true;}}//token 無效 401無權限response.setStatus(401);return false;}//完成方法:從threadLocal中刪除user對象@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserThreadLocal.remove();} }

定義過濾器。?注冊獲取器。?攔截到請求。如果命中controller的方法,?判斷該方法@NoAuthorization?有沒有使用自定義注解標記。不需要token攔截。如果沒有就攔截。拿到請求token? 驗證token 。如果token合法?

UserThreadLocal.setUser(user); 將用戶信息。放到ThreadLocal用戶線程。

在service?中。就那可以拿到user用戶信息了。不用每個service?方法都校驗一次token?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的UserThreadLocal 用户线程Token拦截验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。