qrs 1 månad sedan
förälder
incheckning
452327050a

+ 14 - 0
alien-second/pom.xml

@@ -247,12 +247,26 @@
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
+
+        <!-- openfeign -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-okhttp</artifactId>
+        </dependency>
+        <!-- openfeign -->
+
         <dependency>
             <groupId>shop.alien</groupId>
             <artifactId>alien-entity</artifactId>
             <version>1.0.0</version>
             <scope>compile</scope>
         </dependency>
+
         <dependency>
             <groupId>shop.alien</groupId>
             <artifactId>alien-util</artifactId>

+ 6 - 0
alien-second/src/main/java/shop/alien/second/AlienSecondApplication.java

@@ -1,8 +1,14 @@
 package shop.alien.second;
 
+import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
 
+//@ComponentScan("shop.alien.second.*")
+@EnableFeignClients(basePackages = {"shop.alien.second.feign"})
+@EnableSwaggerBootstrapUI
 @SpringBootApplication
 public class AlienSecondApplication {
 

+ 14 - 0
alien-second/src/main/java/shop/alien/second/config/FeignConfig.java

@@ -0,0 +1,14 @@
+package shop.alien.second.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FeignConfig {
+
+    @Bean
+    public FeignTokenInterceptor feignTokenInterceptor() {
+        return new FeignTokenInterceptor();
+    }
+
+}

+ 56 - 0
alien-second/src/main/java/shop/alien/second/config/FeignOptionConfig.java

@@ -0,0 +1,56 @@
+package shop.alien.second.config;
+
+import feign.Logger;
+import feign.Request;
+import feign.codec.Decoder;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringDecoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Openfeign配置
+ */
+@Configuration
+public class FeignOptionConfig {
+
+    @Value("${openfeign.timeout.connect}")
+    private int connectTimeout;
+
+    @Value("${openfeign.timeout.read}")
+    private int readTimeout;
+
+    @Bean
+    public Request.Options options() {
+        return new Request.Options(connectTimeout, readTimeout, true);
+    }
+
+    /**
+     * OpenFeign打印日志, 需在配置文件中指定feign类位置
+     * <p>
+     * NONE, 默认,不显示任何日志
+     * BASIC, 仅记录请求方法、url、响应状态码及执行时间
+     * HEADERS, 除记录BASIC信息外,还记录请求头和响应头
+     * FULL,除了HEADERS信息外,还有请求和响应正文以及元数据
+     *
+     * @return 日志等级
+     */
+    @Bean
+    Logger.Level feignLoggerLevel() {
+        return Logger.Level.BASIC;
+//        return Logger.Level.FULL; // 必须设置为 FULL 才能获取响应体
+    }
+
+//    @Bean
+//    public FeignBodyLogger feignLogger() {
+//        return new FeignBodyLogger();
+//    }
+
+    @Bean
+    public Decoder feignDecoder(ObjectFactory<HttpMessageConverters> converters) {
+        return new GzipResponseDecoder(new SpringDecoder(converters));
+    }
+
+}

+ 28 - 0
alien-second/src/main/java/shop/alien/second/config/FeignTokenInterceptor.java

@@ -0,0 +1,28 @@
+package shop.alien.second.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+public class FeignTokenInterceptor implements RequestInterceptor {
+
+    @Override
+    public void apply(RequestTemplate requestTemplate) {
+        // 从安全上下文中获取 Token(例如 JWT Token)
+        String token = getTokenFromSecurityContext();
+
+        // 将 Token 添加到请求头中
+        if (token != null) {
+            requestTemplate.header("Authorization", token);
+        }
+    }
+
+    private String getTokenFromSecurityContext() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes != null) {
+            return attributes.getRequest().getHeader("Authorization");
+        }
+        return null;
+    }
+}

+ 75 - 0
alien-second/src/main/java/shop/alien/second/config/GzipResponseDecoder.java

@@ -0,0 +1,75 @@
+package shop.alien.second.config;
+
+import feign.Response;
+import feign.codec.Decoder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * 实现支持 GZip 的解码器
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2025/3/19 9:47
+ */
+@Slf4j
+public class GzipResponseDecoder implements Decoder {
+
+    private final Decoder delegate;
+
+    public GzipResponseDecoder(Decoder delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public Object decode(Response response, Type type) throws IOException {
+        // 判断是否为 GZip 压缩响应
+        if (isGzipResponse(response)) {
+            try (InputStream is = response.body().asInputStream();
+                 GZIPInputStream gzipIs = new GZIPInputStream(is)) {
+                // 读取解压后的数据
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                byte[] buffer = new byte[1024];
+                int len;
+                while ((len = gzipIs.read(buffer)) > 0) {
+                    baos.write(buffer, 0, len);
+                }
+//                // 打印解压后的原始内容
+//                String rawBody = baos.toString("UTF-8");
+//                System.out.println("[GZip 解压内容] " + rawBody);
+                // 构造新的响应对象供后续解析
+                Response modifiedResponse = Response.builder()
+                        .body(baos.toByteArray())
+                        .headers(response.headers())
+                        .status(response.status())
+                        .request(response.request())
+                        .build();
+                return delegate.decode(modifiedResponse, type);
+            }
+        }
+        return delegate.decode(response, type);
+    }
+
+    /**
+     * 判断是否为 GZip 压缩响应
+     *
+     * @param response 请求内容
+     * @return 是否为 GZip 压缩响应
+     */
+    private boolean isGzipResponse(Response response) {
+        Collection<String> strings = response.headers().get("Content-Encoding");
+        if (null == strings) {
+            return false;
+        }
+        return response.headers().get("Content-Encoding")
+                .stream()
+                .anyMatch(enc -> enc.contains("gzip"));
+    }
+
+}

+ 109 - 0
alien-second/src/main/java/shop/alien/second/config/OkHttpConfig.java

@@ -0,0 +1,109 @@
+package shop.alien.second.config;
+
+import okhttp3.ConnectionPool;
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.net.ssl.*;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * OkHttp配置
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/10/27 10:29
+ */
+@Configuration
+public class OkHttpConfig {
+
+    /**
+     * OkHttp 客户端配置
+     *
+     * @return OkHttp 客户端配
+     */
+    @Bean
+    public OkHttpClient okHttpClient() {
+        return new OkHttpClient.Builder()
+                .sslSocketFactory(sslSocketFactory(), x509TrustManager())
+                .hostnameVerifier(hostnameVerifier())
+                //是否开启缓存
+                .retryOnConnectionFailure(false)
+                //连接池
+                .connectionPool(pool())
+                //连接超时时间
+                .connectTimeout(15L, TimeUnit.SECONDS)
+                //读取超时时间
+                .readTimeout(15L, TimeUnit.SECONDS)
+                //是否允许重定向
+                .followRedirects(true)
+                .build();
+    }
+
+    /**
+     * 忽略证书校验
+     *
+     * @return 证书信任管理器
+     */
+    @Bean
+    public X509TrustManager x509TrustManager() {
+        return new X509TrustManager() {
+            @Override
+            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
+            }
+
+            @Override
+            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
+            }
+
+            @Override
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[0];
+            }
+        };
+    }
+
+    /**
+     * 信任所有 SSL 证书
+     *
+     * @return
+     */
+    @Bean
+    public SSLSocketFactory sslSocketFactory() {
+        try {
+            TrustManager[] trustManagers = new TrustManager[]{x509TrustManager()};
+            SSLContext sslContext = SSLContext.getInstance("SSL");
+            sslContext.init(null, trustManagers, new SecureRandom());
+            return sslContext.getSocketFactory();
+        } catch (NoSuchAlgorithmException | KeyManagementException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 连接池配置
+     *
+     * @return 连接池
+     */
+    @Bean
+    public ConnectionPool pool() {
+        // 最大连接数、连接存活时间、存活时间单位(分钟)
+        return new ConnectionPool(200, 5, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 信任所有主机名
+     *
+     * @return 主机名校验
+     */
+    @Bean
+    public HostnameVerifier hostnameVerifier() {
+        return (s, sslSession) -> true;
+    }
+}

+ 57 - 0
alien-second/src/main/java/shop/alien/second/config/SwaggerConfig.java

@@ -0,0 +1,57 @@
+package shop.alien.second.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * swagger配置类
+ *
+ * @author ssk
+ * @version 1.0
+ * @date 2024/12/4 9:17
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    /**
+     * controller扫描
+     *
+     * @return controller扫描
+     */
+    @Bean
+    public Docket docket() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .groupName("二手平台")
+                .select()
+                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    /**
+     * Api标题信息
+     *
+     * @return api标题Api标题信息
+     */
+    public ApiInfo apiInfo() {
+        Contact contact = new Contact("二手平台", "https://xxxx.xxxx", "");
+        return new ApiInfoBuilder()
+                .title("二手平台")
+                .description("二手平台")
+                .license("二手平台")
+                .contact(contact)
+                .termsOfServiceUrl("https://xxxx.xxxx")
+                .version("1.0.0")
+                .build();
+    }
+}

+ 15 - 5
alien-second/src/main/java/shop/alien/second/controller/TestController.java

@@ -1,6 +1,7 @@
 package shop.alien.second.controller;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiSort;
 import lombok.RequiredArgsConstructor;
@@ -9,25 +10,34 @@ import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.LifeMessageVo;
+import shop.alien.second.feign.AlienStoreFeign;
 import shop.alien.util.common.JwtUtil;
 
 import javax.servlet.http.HttpServletRequest;
 
 @Slf4j
 @Api(tags = {"二期-阿里接口"})
-@ApiSort(9)
+@ApiSort(1)
 @CrossOrigin
 @RestController
 @RequestMapping("/testCon")
 @RequiredArgsConstructor
 public class TestController {
 
-    @GetMapping("test")
-    public String test(HttpServletRequest request) {
-        JSONObject data = JwtUtil.getTokenInfo(request.getHeader("Authorization"));
+    private final AlienStoreFeign alienStoreFeign;
 
-        System.out.println(222222);
+    @GetMapping("/test")
+    public String test() {
+        JSONObject data = JwtUtil.getCurrentUserInfo();
+        System.out.println(111);
         System.out.println(data);
+
+        JSONObject iPage = alienStoreFeign.getMessageList("user_13942852153", 1, 10, 1);
+        System.out.println(222);
+        System.out.println(iPage);
+
         return "hello world";
     }
 

+ 17 - 0
alien-second/src/main/java/shop/alien/second/feign/AlienStoreFeign.java

@@ -0,0 +1,17 @@
+package shop.alien.second.feign;
+
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(url = "http://localhost:8888", name = "alienStore")
+public interface AlienStoreFeign {
+
+    @GetMapping("/message/getMessageList")
+    JSONObject getMessageList(@RequestParam(value = "receiverId") String receiverId,
+                                           @RequestParam(value = "page") int page,
+                                           @RequestParam(value = "size") int size,
+                                           @RequestParam(value = "friendType") int friendType);
+
+}

+ 11 - 0
alien-util/src/main/java/shop/alien/util/common/JwtUtil.java

@@ -144,4 +144,15 @@ public class JwtUtil {
         return null;
     }
 
+    public static JSONObject getCurrentUserInfo() {
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes != null) {
+            HttpServletRequest request = attributes.getRequest();
+            String token = request.getHeader("Authorization");
+            Claims claims = JwtUtil.parseJWT(token);
+            return JSONObject.parseObject(claims.get("sub").toString());
+        }
+        return null;
+    }
+
 }

+ 5 - 0
pom.xml

@@ -50,6 +50,11 @@
             </dependency>
 
             <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-starter-openfeign</artifactId>
+                <version>2.2.1.RELEASE</version>
+            </dependency>
+            <dependency>
                 <groupId>io.github.openfeign</groupId>
                 <artifactId>feign-okhttp</artifactId>
                 <version>13.3</version>