zero 1 mesiac pred
rodič
commit
f30e499cc0

+ 65 - 43
src/main/java/com/cslg/ppa/common/okhttp/MyCookieStore.java

@@ -11,42 +11,52 @@ import org.apache.commons.lang3.StringUtils;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-
 /**
- * cookie管理
+ * Cookie管理类,用于处理HTTP请求中的Cookie存储和加载
+ *
  * @author zsq
- * @version 1.0
+ * @version 1.1
  * @date 2021/3/31 16:17
  */
 public class MyCookieStore implements CookieJar {
 
-    /**打印日志用**/
+    /**
+     * 打印日志用,开发时设为true,发布时设为false
+     */
     private static volatile boolean debug = false;
 
-    /**登录后拿到的token**/
+    /**
+     * 登录后拿到的token
+     */
     private static String TOKEN = "";
 
-    /**管理cookie**/
+    /**
+     * 管理cookie,使用ConcurrentHashMap保证线程安全
+     */
     private static ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>> cookieStore = new ConcurrentHashMap<>();
 
-    /**token资源文件位置**/
+    /**
+     * token资源文件位置
+     */
     public static final String TOKEN_FILE_PATH = "/store/token.txt";
 
-    /**cookie资源文件位置**/
+    /**
+     * cookie资源文件位置
+     */
     public static final String COOKIE_FILE_PATH = "/store/cookie.txt";
 
-
     @Override
     public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
         log("-----保存cookie");
 
-        //保存cookie
+        // 保存cookie
         log("httpUrl host: " + httpUrl.host());
         ConcurrentHashMap<String, Cookie> cookieMap = cookieStore.get(httpUrl.host());
         if (cookieMap == null) {
@@ -57,8 +67,9 @@ public class MyCookieStore implements CookieJar {
             cookieMap.put(cookie.name(), cookie);
         }
 
-        if (list != null && list.size() > 0) {
-            //存到本地,需要自己写持久化的实现,可用redis,或本地
+        // 持久化cookie到文件(示例中未实现具体逻辑,可根据需要实现)
+        if (list != null && !list.isEmpty()) {
+            persistCookiesToFile();
         }
 
         log("-----保存到cookie:" + cookieStore.toString());
@@ -71,7 +82,7 @@ public class MyCookieStore implements CookieJar {
         List<Cookie> cookies = new ArrayList<>();
         Map<String, Cookie> cookieMap = cookieStore.get(httpUrl.host());
         if (cookieMap != null) {
-            cookieMap.forEach((name, cookie)->{
+            cookieMap.forEach((name, cookie) -> {
                 log("--cookie:" + name + "=" + cookie.value());
                 cookies.add(cookie);
             });
@@ -82,6 +93,7 @@ public class MyCookieStore implements CookieJar {
 
     public static void setToken(String token) {
         TOKEN = token;
+        persistTokenToFile(); // 新增:更新token时持久化到文件
     }
 
     public static String getToken() {
@@ -89,24 +101,36 @@ public class MyCookieStore implements CookieJar {
     }
 
     /**
-     * 保存cookie
-     * @param resPath 资源文件目录
+     * 保存cookie到文件(示例中未实现具体序列化逻辑,可根据需要实现)
      */
-    public static void saveCookie (String resPath, ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>> cookieMap) {
+    private static void persistCookiesToFile() {
+        // 这里可以添加将cookieStore序列化并保存到文件的逻辑
+        // 例如使用JSON序列化库将cookieStore转换为字符串并写入文件
+    }
 
+    /**
+     * 保存token到文件
+     */
+    private static void persistTokenToFile() {
+        saveToFile(TOKEN_FILE_PATH, TOKEN);
     }
 
     /**
      * 保存到文件
+     *
      * @param resPath 资源文件目录
+     * @param str     要保存的字符串内容
      */
-    public static void saveToFile (String resPath, String str) {
+    public static void saveToFile(String resPath, String str) {
         URL resource = MyCookieStore.class.getResource(resPath);
-        try {
-            IOUtils.write(str.getBytes(), new FileOutputStream(resource.getFile()));
-        } catch (IOException e) {
-            System.out.println("---保存数据到本地失败");
-            e.printStackTrace();
+        if (resource != null) {
+            try (OutputStream outputStream = new FileOutputStream(resource.getFile())) {
+                IOUtils.write(str.getBytes(), outputStream);
+            } catch (IOException e) {
+                System.err.println("---保存数据到本地失败: " + e.getMessage());
+            }
+        } else {
+            System.err.println("---资源路径无效: " + resPath);
         }
     }
 
@@ -114,18 +138,18 @@ public class MyCookieStore implements CookieJar {
      * 加载cookie到内存
      */
     public static void loadCookie() {
-        InputStream resourceAsStream = MyCookieStore.class.getResourceAsStream(COOKIE_FILE_PATH);
-        String cookieTxt = null;
-        try {
-            cookieTxt = IOUtils.toString(resourceAsStream);
-            if (StringUtils.isNotBlank(cookieTxt)) {
-                //转成对象
-                ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>> nativeCookie = JsonUtils.jsonToObj(cookieTxt,
-                        new TypeReference<ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>>>() {});
-                cookieStore = nativeCookie;
+        try (InputStream resourceAsStream = MyCookieStore.class.getResourceAsStream(COOKIE_FILE_PATH)) {
+            if (resourceAsStream != null) {
+                String cookieTxt = IOUtils.toString(resourceAsStream);
+                if (StringUtils.isNotBlank(cookieTxt)) {
+                    // 转成对象
+                    ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>> nativeCookie = JsonUtils.jsonToObj(cookieTxt,
+                            new TypeReference<ConcurrentHashMap<String, ConcurrentHashMap<String, Cookie>>>() {});
+                    cookieStore = nativeCookie;
+                }
             }
         } catch (IOException e) {
-            e.printStackTrace();
+            System.err.println("---加载cookie文件失败: " + e.getMessage());
         }
     }
 
@@ -133,21 +157,19 @@ public class MyCookieStore implements CookieJar {
      * 加载token到内存
      */
     public static void loadToken() {
-        InputStream resourceAsStream = MyCookieStore.class.getResourceAsStream(TOKEN_FILE_PATH);
-        String s = null;
-        try {
-            s = IOUtils.toString(resourceAsStream);
-            TOKEN = s;
+        try (InputStream resourceAsStream = MyCookieStore.class.getResourceAsStream(TOKEN_FILE_PATH)) {
+            if (resourceAsStream != null) {
+                String s = IOUtils.toString(resourceAsStream);
+                TOKEN = s;
+            }
         } catch (IOException e) {
-            e.printStackTrace();
+            System.err.println("---加载token文件失败: " + e.getMessage());
         }
     }
 
     public static void log(String log) {
-        if (!debug) {
-            return;
+        if (debug) {
+            System.out.println(log);
         }
-        System.out.println(log);
     }
-
-}
+}

+ 51 - 30
src/main/java/com/cslg/ppa/common/okhttp/MyOkHttpClient.java

@@ -1,50 +1,71 @@
 package com.cslg.ppa.common.okhttp;
 
+import jakarta.validation.constraints.NotNull;
 import okhttp3.*;
 
 import java.io.IOException;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 /**
- * 静态化一个okhttp实例
+ * 静态化一个 OkHttp 客户端实例,提供全局单例
+ *
  * @author zsq
- * @version 1.0
+ * @version 1.1
  * @date 2021/3/31 10:58
  */
 public class MyOkHttpClient {
 
-    /**okhttp实例**/
-    public static OkHttpClient client;
+    /** OkHttp 客户端单例 */
+    private static volatile OkHttpClient client;
 
-    private static String referer = "https://mp.weixin.qq.com/";
-    private static String userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36";
-    private static String xRequestedWith = "XMLHttpRequest";
+    /** 默认请求头配置 */
+    private static final String DEFAULT_REFERER = "https://mp.weixin.qq.com/";
+    private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36";
+    private static final String DEFAULT_X_REQUESTED_WITH = "XMLHttpRequest";
 
-    static {
-        //初始化一个okhttp实例
-        client = new OkHttpClient.Builder()
+    /**
+     * 获取 OkHttp 客户端单例(线程安全)
+     */
+    public static OkHttpClient getClient() {
+        if (client == null) {
+            synchronized (MyOkHttpClient.class) {
+                if (client == null) {
+                    client = createOkHttpClient();
+                }
+            }
+        }
+        return client;
+    }
+
+    /**
+     * 创建并配置 OkHttp 客户端
+     */
+    private static OkHttpClient createOkHttpClient() {
+        return new OkHttpClient.Builder()
                 .connectTimeout(15, TimeUnit.SECONDS)
-                .connectionPool(new ConnectionPool(5, 20, TimeUnit.SECONDS))
                 .readTimeout(15, TimeUnit.SECONDS)
-
-
-                //管理cookie
-                .cookieJar(new MyCookieStore())
-                //添加请求头
-                .addInterceptor(new Interceptor() {
-                    @Override
-                    public Response intercept(Chain chain) throws IOException {
-                        //添加请求头
-                        Request request = chain.request().newBuilder()
-                                .addHeader("referer", referer)
-                                .addHeader("userAgent", userAgent)
-                                .addHeader("xRequestedWith", xRequestedWith)
-                                .build();
-
-                        return chain.proceed(request);
-                    }
-                })
+                .writeTimeout(15, TimeUnit.SECONDS)
+                .connectionPool(new ConnectionPool(5, 20, TimeUnit.SECONDS))
+                .cookieJar(new MyCookieStore()) // 使用自定义 Cookie 管理
+                .addInterceptor(new HeaderInterceptor()) // 使用独立的拦截器类
                 .build();
     }
 
-}
+    /**
+     * 自定义请求头拦截器
+     */
+    private static class HeaderInterceptor implements Interceptor {
+        @NotNull
+        @Override
+        public Response intercept(@NotNull Chain chain) throws IOException {
+            Request originalRequest = chain.request();
+            Request newRequest = originalRequest.newBuilder()
+                    .header("Referer", DEFAULT_REFERER) // 修正请求头名称(首字母大写)
+                    .header("User-Agent", DEFAULT_USER_AGENT) // 修正请求头名称
+                    .header("X-Requested-With", DEFAULT_X_REQUESTED_WITH) // 修正请求头名称
+                    .build();
+            return chain.proceed(newRequest);
+        }
+    }
+}

+ 6 - 3
src/main/java/com/cslg/ppa/common/utils/HttpUtils.java

@@ -5,6 +5,8 @@ import com.cslg.ppa.common.exception.XiaoShiException;
 import com.cslg.ppa.common.okhttp.MyOkHttpClient;
 import okhttp3.*;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -23,15 +25,16 @@ public class HttpUtils {
 
 
     /**okhttp 实例**/
-    private static OkHttpClient client = MyOkHttpClient.client;
+    private static OkHttpClient client = new OkHttpClient();;
+//    private static CloseableHttpClient client = HttpClients.custom()
+//                .build();
 
     /**解析键值对正则**/
     public static final Pattern PAT_KEY_VALUE = Pattern.compile("[\\w]*=[\\w,/]*");
 
 
     public static String doGet(String url, Map<String, String> params,String cookie) {
-        Request.Builder reqBuild = new Request.Builder()
-                .addHeader("Cookie", cookie);
+        Request.Builder reqBuild = new Request.Builder();
         HttpUrl.Builder urlBuilder = HttpUrl.parse(url)
                 .newBuilder();
         if (params != null) {

+ 13 - 0
src/main/java/com/cslg/ppa/service/commom/WeChatLoginCheckService.java

@@ -3,6 +3,7 @@ package com.cslg.ppa.service.commom;
 import com.cslg.ppa.common.okhttp.MyCookieStore;
 import com.cslg.ppa.common.utils.HttpUtils;
 import com.cslg.ppa.dto.MailMessageDTO;
+import com.cslg.ppa.entity.commom.Article;
 import com.cslg.ppa.entity.commom.WxResultBody;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -126,6 +127,18 @@ public class WeChatLoginCheckService {
             System.out.println(token);
             //设置全局token值
             MyCookieStore.setToken(token);
+
+            final String token1 = MyCookieStore.getToken();
+            System.out.println("AAA:" + token1);
+            try {
+                WxResultBody<List<Article>> findExList = WeiXinApi.findExList("MzA4NDAzMjcyOA==", token, cookie);
+                List<Article> exList = findExList.getApp_msg_list();
+                System.out.println("=====================");
+                System.out.println(exList);
+                System.out.println(exList.size());
+            } catch (Exception ignored) {
+
+            }
             log.info("微信登录成功,token已保存: {}", token);
         } catch (Exception e) {
             log.error("处理登录成功失败: {}", e.getMessage(), e);

+ 3 - 1
src/test/java/com/cslg/ppa/PpaApplicationTests.java

@@ -165,10 +165,12 @@ class PpaApplicationTests {
 //        final WxResultBody resultBody = WeiXinApi.startLogin("");
 //        System.out.println(resultBody);
         weChatLoginCheckService.checkWeChatLoginStatus();
-//        final WxResultBody<List<Article>> exList = WeiXinApi.findExList("MzA4NDAzMjcyOA==", cookie);
+//        final String token = MyCookieStore.getToken();
+//        final WxResultBody<List<Article>> exList = WeiXinApi.findExList("MzA4NDAzMjcyOA==", "1637393640", "ua_id=8UnTxRAhRO6jiQkLAAAAAAXvY8otZtRgM2BdA6_XQHc=;uuid=a0e6c9b0c1bdd992fea6f540077f3539");
 //        final WxResultBody wxResultBody = WeiXinApi.askQRCode("ua_id=RwJem7gHJ6Ll5U6PAAAAAFqYen0UbbewvXRsMX-OzTo=;uuid=de89a4ac68a63dc982b4a5d78a5f06d0");
 //        Integer status = wxResultBody.getStatus();
 //        final WxResultBody body = WeiXinApi.bizlogin("ua_id=F3RqghH5Azk3aeUEAAAAAOgunt_vg96DbZ_6AgeF60s=;uuid=5425f5f5a83783d4fb9e2b465a510b7a");
+//        final String token = MyCookieStore.getToken();
         System.out.println("-------------");
     }