• 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
  • 相关阅读:
    Ubuntu下成功安装台式机网卡realtek的rtl8188eu芯片驱动并实现AP功能
    背包问题九讲笔记_01背包(转)
    Ubuntu 12.04 LTS 中文输入法的安装 (转载)
    ubuntu扩展屏幕
    模拟————找规律
    数学——费马小定理、快速幂,组合数
    DP———1.最大子连续子序列和
    FOJ ——Problem 1759 Super A^B mod C
    POJ
    CSU 2136 ——湖南多校对抗赛 I
  • 原文地址:https://www.cnblogs.com/longxok/p/11043626.html
Copyright © 2020-2023  润新知