基本上到第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