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