From b241f38f89ad2178888f31973f3d8e0dfd2f511e Mon Sep 17 00:00:00 2001 From: zengwei-cogiot Date: Tue, 12 Sep 2023 16:25:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=A0=E6=95=88=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/abin/mallchat/common/MDCKey.java | 6 ++ .../aspect/FrequencyControlAspect.java | 1 - .../config/InterceptorConfig.java | 29 ++++++++ .../intecepter/CollectorInterceptor.java | 37 ++++++++++ .../intecepter/TokenInterceptor.java | 69 +++++++++++++++++++ 5 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 mallchat-tools/mallchat-common-starter/src/main/java/com/abin/mallchat/common/MDCKey.java create mode 100644 mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/config/InterceptorConfig.java create mode 100644 mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/CollectorInterceptor.java create mode 100644 mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/TokenInterceptor.java diff --git a/mallchat-tools/mallchat-common-starter/src/main/java/com/abin/mallchat/common/MDCKey.java b/mallchat-tools/mallchat-common-starter/src/main/java/com/abin/mallchat/common/MDCKey.java new file mode 100644 index 0000000..ae0f6d2 --- /dev/null +++ b/mallchat-tools/mallchat-common-starter/src/main/java/com/abin/mallchat/common/MDCKey.java @@ -0,0 +1,6 @@ +package com.abin.mallchat.common; + +public interface MDCKey { + String TID = "tid"; + String UID = "uid"; +} diff --git a/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/aspect/FrequencyControlAspect.java b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/aspect/FrequencyControlAspect.java index d17fc2b..269a34c 100644 --- a/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/aspect/FrequencyControlAspect.java +++ b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/aspect/FrequencyControlAspect.java @@ -33,7 +33,6 @@ import java.util.stream.Collectors; public class FrequencyControlAspect { @Around("@annotation(com.abin.frequencycontrol.annotation.FrequencyControl)||@annotation(com.abin.frequencycontrol.annotation.FrequencyControlContainer)") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { - System.out.println("FrequencyControlAspect start"); Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); FrequencyControl[] annotationsByType = method.getAnnotationsByType(FrequencyControl.class); Map keyMap = new HashMap<>(); diff --git a/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/config/InterceptorConfig.java b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/config/InterceptorConfig.java new file mode 100644 index 0000000..365e15e --- /dev/null +++ b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/config/InterceptorConfig.java @@ -0,0 +1,29 @@ +package com.abin.frequencycontrol.config; + +import com.abin.frequencycontrol.intecepter.CollectorInterceptor; +import com.abin.frequencycontrol.intecepter.TokenInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +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 InterceptorConfig implements WebMvcConfigurer { + + @Autowired + private TokenInterceptor tokenInterceptor; + @Autowired + private CollectorInterceptor collectorInterceptor; + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(tokenInterceptor) + .addPathPatterns("/capi/**"); + registry.addInterceptor(collectorInterceptor) + .addPathPatterns("/capi/**"); + } +} diff --git a/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/CollectorInterceptor.java b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/CollectorInterceptor.java new file mode 100644 index 0000000..7882534 --- /dev/null +++ b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/CollectorInterceptor.java @@ -0,0 +1,37 @@ +package com.abin.frequencycontrol.intecepter; + +import cn.hutool.extra.servlet.ServletUtil; +import com.abin.frequencycontrol.domain.dto.RequestInfo; +import com.abin.frequencycontrol.util.RequestHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Optional; + +/** + * 信息收集的拦截器 + */ +@Order(1) +@Slf4j +@Component +public class CollectorInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + RequestInfo info = new RequestInfo(); + info.setUid(Optional.ofNullable(request.getAttribute(TokenInterceptor.ATTRIBUTE_UID)).map(Object::toString).map(Long::parseLong).orElse(null)); + info.setIp(ServletUtil.getClientIP(request)); + RequestHolder.set(info); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + RequestHolder.remove(); + } + +} diff --git a/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/TokenInterceptor.java b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/TokenInterceptor.java new file mode 100644 index 0000000..f326a59 --- /dev/null +++ b/mallchat-tools/mallchat-frequency-control/src/main/java/com/abin/frequencycontrol/intecepter/TokenInterceptor.java @@ -0,0 +1,69 @@ +package com.abin.frequencycontrol.intecepter; + +import com.abin.frequencycontrol.exception.HttpErrorEnum; +import com.abin.mallchat.common.MDCKey; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Objects; +import java.util.Optional; + +@Order(-2) +@Slf4j +@Component +public class TokenInterceptor implements HandlerInterceptor { + + public static final String AUTHORIZATION_HEADER = "Authorization"; + public static final String AUTHORIZATION_SCHEMA = "Bearer "; + public static final String ATTRIBUTE_UID = "uid"; +// +// @Autowired +// private LoginService loginService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //获取用户登录token + String token = getToken(request); +// Long validUid = loginService.getValidUid(token); + Long validUid = 1L; + if (Objects.nonNull(validUid)) {//有登录态 + request.setAttribute(ATTRIBUTE_UID, validUid); + } else { + boolean isPublicURI = isPublicURI(request.getRequestURI()); + if (!isPublicURI) {//又没有登录态,又不是公开路径,直接401 + HttpErrorEnum.ACCESS_DENIED.sendHttpError(response); + return false; + } + } + MDC.put(MDCKey.UID, String.valueOf(validUid)); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + MDC.remove(MDCKey.UID); + } + + /** + * 判断是不是公共方法,可以未登录访问的 + * + * @param requestURI + */ + private boolean isPublicURI(String requestURI) { + String[] split = requestURI.split("/"); + return split.length > 2 && "public".equals(split[3]); + } + + private String getToken(HttpServletRequest request) { + String header = request.getHeader(AUTHORIZATION_HEADER); + return Optional.ofNullable(header) + .filter(h -> h.startsWith(AUTHORIZATION_SCHEMA)) + .map(h -> h.substring(AUTHORIZATION_SCHEMA.length())) + .orElse(null); + } +}