????????本文使用的微服務版本為springcloudAlbaba :2021.0.4.0
????????微服務工程,一般公共的東西都放入一個工程,別的微服務都會引入這個工程,比如common-service,那么就可以在這個工程編寫一個攔截器:,比如:
public class UserInfoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//從請求頭中獲取用戶信息String header = request.getHeader("user-info");if(StrUtil.isNotBlank(header)){//這里UserContext的user是個ThreadLocalUserContext.setUser(Long.valueOf(header));}return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserContext.removeUser();} }
????????這里是做個用戶信息獲取的攔截器,從請求頭中獲取用戶信息,然后塞入ThreadLocal中,供后續業務使用。
????????定義完了,為了使它生效,編譯一個配置類:
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());} }
????????然后利用springboot自動裝配的原理,在spring.factroies中添加MvcConfig的全路徑,
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.*.common.config.MvcConfig
????????這里*用你實際的就好,別真的寫*。
????????這樣所有引入common-service依賴的微服務都添加了這個攔截器。
????????但是注意如果某個微服務啟動報錯,可能是你的某這個微服務沒有引入springmvc的依賴,比如網關微服務,網關不需要springmvc的依賴,也不需要這個攔截器,
? ? ? ? 我們同樣利用springboot自動裝配ConditionalOnClass注解的特性來讓網關不引入這個攔截器。只需要加上一段@ConditionalOnClass(DispatcherServlet.class)即可
@Configuration @ConditionalOnClass(DispatcherServlet.class) public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());} }
????????DispatcherServlet是springmvc的核心類,使用ConditionalOnClass,即判斷當前有沒有引入springmvc的依賴來判斷是否引入MvcConfig 這個配置類,網關沒有springmvc的依賴,這樣這個配置類就不會生效。
?