package interceptor;
import context.UserContext;
import context.UserInfo;
import org.slf4j.MDC;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof HandlerMethod){
HandlerMethod handlerMethod = (HandlerMethod) handler;
LoginRequired loginRequired = handlerMethod.getMethodAnnotation(LoginRequired.class);
if(loginRequired != null){
UserInfo userInfo = new UserInfo();
userInfo.setUserName("a");
UserContext.setUserInfo(userInfo);
}
ApiPermission apiPermission = handlerMethod.getMethodAnnotation(ApiPermission.class);
if(apiPermission != null){
request.getHeader("appId");
request.getHeader("sign");
request.getHeader("time");
}
}
String traceId = request.getHeader("traceId");
MDC.put("traceId", traceId == null ? "1-1-1-1" : traceId);
return super.preHandle(request, response, handler);
}
}
package interceptor;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.HttpContext;
import org.slf4j.MDC;
import java.io.IOException;
public class HttpUtils {
private HttpClient httpClient = HttpClientBuilder.create().addInterceptorFirst(new HttpRequestInterceptor(){
@Override
public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
httpRequest.setHeader("traceId", MDC.get("traceId"));
}
}).build();
}
package interceptor;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.*;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
@Activate(group = "consumer", order = Ordered.HIGHEST_PRECEDENCE)
public class RpcConsumerTraceFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
RpcContext rpcContext = RpcContext.getContext();
rpcContext.setAttachment("traceId", MDC.get("traceId"));
return invoker.invoke(invocation);
}
}
package interceptor;
import com.alibaba.dubbo.rpc.*;
import org.slf4j.MDC;
public class RpcProviderTraceFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
RpcContext rpcContext = RpcContext.getContext();
MDC.put("traceId", rpcContext.getAttachment("traceId"));
return invoker.invoke(invocation);
}
}
package interceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
private DemoInterceptor demoInterceptor() {
return new DemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(demoInterceptor()).addPathPatterns("/**");
}
}
package interceptor;
public @interface ApiPermission {
}
package interceptor;
public @interface LoginRequired {
}