All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dounine.clouddisk360.store.CookieStoreUT Maven / Gradle / Ivy

package com.dounine.clouddisk360.store;

import com.alibaba.fastjson.JSONReader;
import com.alibaba.fastjson.JSONWriter;
import com.dounine.clouddisk360.parser.deserializer.BaseConst;
import com.dounine.clouddisk360.parser.deserializer.login.LoginUserToken;
import org.apache.commons.io.FileUtils;
import org.apache.http.client.CookieStore;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

public class CookieStoreUT {

	private static final Logger LOGGER = LoggerFactory.getLogger(CookieStoreUT.class);

	private static final String COOKIE_STORE_PATH = File.separator+"cookieStore"+File.separator;

	private CookieStore cookieStore;
	private LoginUserToken loginUserToken;

	public void writeCookieStoreToDisk(CookieStore cookieStore, String[] filterCookies) {
		writeCookiesToDisk(cookieStore.getCookies(), filterCookies, true);
	}

	public void writeCookieStoreToDisk(CookieStore cookieStore, String[] filterCookies, boolean converCookieStore) {
		writeCookiesToDisk(cookieStore.getCookies(), filterCookies, converCookieStore);
	}

	public CookieStore readCookieStoreForDisk() {
		return readCookieStoreForDisk(null);
	}

	public String readCookieValueForDisk(String filter) {
		CookieStore cookieStore = readCookieStoreForDisk(new String[] { filter });
		List cookies = cookieStore.getCookies();
		for (Cookie cookie : cookies) {
			if (cookie.getName().equals(filter)) {
				return cookie.getValue();
			}
		}
		return null;
	}

	public CookieStore readCookieStoreForDisk(String[] filterCookies) {
		if (null != cookieStore)
			return cookieStore;

		if (null == filterCookies)
			filterCookies = new String[0];
		List cookies = new ArrayList<>(0);
		String path = new StringBuilder(BasePathCommon.BASE_PATH).append(loginUserToken.getAccount()).append(COOKIE_STORE_PATH).append(BaseConst.COOKIES_PATH_NAME).toString();
		File cookiesFile = new File(path);
		try {
			if (!cookiesFile.exists()) {
				cookiesFile.getParentFile().mkdirs();
				cookiesFile.createNewFile();
				LOGGER.info(path + "文件不存在,主动创建一个空文件,并返回新创建的cookieStore");
				return new BasicCookieStore();
			}
			if (FileUtils.readFileToString(cookiesFile).length()<2) {
				LOGGER.warn("cookieStore文件内容为空");
				return new BasicCookieStore();
			}
			JSONReader reader = new JSONReader(new FileReader(cookiesFile));
			reader.startArray();
			while (reader.hasNext()) {
				cookies.add(reader.readObject(BasicCookieStore3.class));
			}
			reader.endArray();
			reader.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		List appacheCookies = new ArrayList<>(cookies.size());
		BasicClientCookie2 cookie2 = null;
		for (BasicCookieStore3 cookieStore3 : cookies) {
			cookie2 = new BasicClientCookie2(cookieStore3.getName(), cookieStore3.getValue());
			cookie2.setCreationDate(cookieStore3.getCreationDate());
			cookie2.setDomain(cookieStore3.getDomain());
			cookie2.setExpiryDate(cookieStore3.getExpiryDate());
			cookie2.setPath(cookieStore3.getPath());
			cookie2.setSecure(cookieStore3.getSecure());
			cookie2.setVersion(cookieStore3.getVersion());
			appacheCookies.add(cookie2);
		}
		List filterCookieLists = new ArrayList<>(appacheCookies.size());
		for (Cookie cookie : appacheCookies) {
			boolean isFilter = false;
			if (filterCookies.length == 0) {
				isFilter = true;
			} else {
				for (String cookieName : filterCookies) {
					if (cookie.getName().equals(cookieName)) {
						isFilter = true;
						break;
					}
				}
			}
			if (isFilter) {
				filterCookieLists.add(cookie);
			}
		}
		cookieStore = new CookieStore() {

			@Override
			public List getCookies() {
				return filterCookieLists;
			}

			@Override
			public boolean clearExpired(Date date) {
				return false;
			}

			@Override
			public void clear() {
				filterCookieLists.clear();
			}

			@Override
			public void addCookie(Cookie cookie) {
				filterCookieLists.add(cookie);
			}
		};
		return cookieStore;
	}

	private void writeCookiesToDisk(List responseCookies, String[] filterCookies, boolean converCookieStore) {
		if (null == filterCookies) {
			filterCookies = new String[0];// 手动初始化,防止异常
		}
		if (null != responseCookies && responseCookies.size() > 0) {
			Map repeatCookieTokens = new HashMap<>();// 过滤重复的token
			List sortCookieTokens = responseCookies.stream()
					.sorted((a, b) -> {
						if(null!=a.getExpiryDate()&&null!=b.getExpiryDate()){
							return a.getExpiryDate().compareTo(b.getExpiryDate());
						}
						return 0;
					}).collect(Collectors.toList());// 按时间降序
			for (Cookie cookie : sortCookieTokens) {// 最大的时间为最新更新的cookie
				repeatCookieTokens.put(cookie.getName(), cookie);
			}
			List removeTokenMoreCookies = new ArrayList<>(repeatCookieTokens.size());
			for (Cookie cookie : repeatCookieTokens.values()) {
				removeTokenMoreCookies.add(cookie);
			}

			List writeDiskCookies = new ArrayList<>(0);// 真正写入磁盘的cookies集合

			List readDiskCookies = readCookieStoreForDisk().getCookies();// 读取磁盘上的cookies缓存

			if (converCookieStore) {
				for (Cookie responseCookie : removeTokenMoreCookies) {
					if (filterCookies.length == 0) {
						writeDiskCookies.add(responseCookie);
					} else {
						for (String cookieName : filterCookies) {
							if (responseCookie.getName().equals(cookieName)) {
								writeDiskCookies.add(responseCookie);
								break;
							}
						}
					}
				}
				for (Cookie diskCookie : readDiskCookies) {
					if (false == writeDiskCookies.stream().anyMatch(c -> c.getName().equals(diskCookie.getName()))) {// 把不存在的cookie重新添加回去
						writeDiskCookies.add(diskCookie);
					}
				}
			} else {
				writeDiskCookies = new ArrayList<>(readDiskCookies);
				for (Cookie responseCookie : removeTokenMoreCookies) {
					if (false == readDiskCookies.stream().anyMatch(c -> c.getName().equals(responseCookie.getName()))) {// 把新的cookie添加进去
						if (filterCookies.length == 0) {
							writeDiskCookies.add(responseCookie);
						} else {
							for (String cookieName : filterCookies) {
								if (responseCookie.getName().equals(cookieName)) {
									writeDiskCookies.add(responseCookie);
									break;
								}
							}
						}
					}
				}
			}

			File cookiesFile = new File(new StringBuffer(BasePathCommon.BASE_PATH).append(loginUserToken.getAccount()).append(COOKIE_STORE_PATH).append(BaseConst.COOKIES_PATH_NAME).toString());

			try {
				if (!cookiesFile.exists()) {
					cookiesFile.getParentFile().mkdirs();
				}
				JSONWriter writer = new JSONWriter(new FileWriter(cookiesFile));
				writer.startArray();
				writeDiskCookies.forEach(writer::writeObject);
				writer.endArray();
				writer.flush();
				writer.close();
				cookieStore = new BasicCookieStore();
				cookieStore.getCookies().clear();
				cookieStore.getCookies().addAll(writeDiskCookies);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public void writeCookieStoreToDisk(CookieStore cookieStore, boolean converCookieStore) {
		writeCookiesToDisk(cookieStore.getCookies(), null, converCookieStore);
	}

	public CookieStore getCookieStore() {
		return cookieStore;
	}

	public void setCookieStore(CookieStore cookieStore) {
		this.cookieStore = cookieStore;
	}

	public LoginUserToken getLoginUserToken() {
		return loginUserToken;
	}

	public void setLoginUserToken(LoginUserToken loginUserToken) {
		this.loginUserToken = loginUserToken;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy