Nacos深入淺出(十)


基本上到第9篇,整個請求的一套就結束了,感覺這里跳跳繞繞很多東西,下面我們來做個總結:
從Nacos配置平台修改,到Client請求更新,事件觸發去取值返回給客戶端,整個過程感覺只分析到了4、5層的深度;
后面整理下后面哪些東西是我們可以從這個Nacos中學到,並且可以在以后工作中去用到的;

1、注解
首先Nacos的注解實現方式,跟我們之前的使用思路不太一樣,很多時候我們在應用中通過AOP的思路去做使用
判讀這個類或者方法或者屬性是否有被我們給標記特定注解了,然后做一些特定的操作,比如下面這個例子:

@Target(ElementType.PARAMETER)          // 可用在方法的參數上
@Retention(RetentionPolicy.RUNTIME)     // 運行時有效
public @interface CurrentUser {
}
@Target({ElementType.METHOD})// 可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 運行時有效
public @interface LoginRequired {
}

 

這兩個注解大家可能一看就會明白,一個用來取當前的登陸用戶信息,一個用來判斷當前操作是否需要登陸(必須含有token才能訪問)
這里就給大家簡單的寫下
currentUser的注解使用方式,這里我們實現了HandlerMethodArgumentResolver
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        User user = (User) webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST);
        if (user != null) {
            return user;
        }
        throw new MissingServletRequestPartException("currentUser");
    }
}

在加到下面這個配置中就OK了

@Configuration
public class WebMvcConfig  {
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new CurrentUserMethodArgumentResolver());
    }
}
 
        
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
    public final static String ACCESS_TOKEN = "accessToken";
    @Resource
    private UserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  {
        // 如果不是映射到方法直接通過
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        // 判斷接口是否需要登錄
        LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
        if(methodAnnotation!=null) {
            // 判斷是否存在令牌信息,如果存在,則允許登錄
            String accessToken = request.getHeader("Authorization");
            if (null == accessToken) {
                throw new RuntimeException("無token,請重新登錄");
            } else {
                // 從Redis 中查看 token 是否過期
                Claims claims;
                try {
                    claims = TokenUtils.parseJWT(accessToken);
                } catch (ExpiredJwtException e) {
                    response.setStatus(401);
                    throw new RuntimeException("token失效,請重新登錄");
                } catch (SignatureException se) {
                    response.setStatus(401);
                    throw new RuntimeException("token令牌錯誤");
                }
                String userName = claims.getId();
                User user = userService.findUserByName(userName);
                if (user == null) {
                    response.setStatus(401);
                     throw new RuntimeException("用戶不存在,請重新登錄");
                }
                // 當前登錄用戶@CurrentUser
                request.setAttribute("currentUser", user);
                return true;
            }
        }else{
            return true;
        }
    }
以上基本就是我們的使用方式;還有一種就是通過AspectJ去實現,基本上思路跟上面是一樣的;



NacosConfigBeanDefinitionRegistrar.java
NacosBeanDefinitionRegistrar.java
NacosConfigListenerRegisteredEvent.java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM