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
原文地址:https://www.cnblogs.com/longxok/p/11043626.html