From 708eb33d0e6e2ec943b8db36fdf8d3ffb515296e Mon Sep 17 00:00:00 2001 From: zhaojun1998 Date: Mon, 20 Apr 2020 21:57:25 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A=E7=9B=98?= =?UTF-8?q?=E4=B8=AD=E6=98=AF=E5=90=A6=E5=A4=9A=E4=B8=AA=20OneDrive=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=9A=84=20BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhaojun/zfile/config/OneDriveConfig.java | 15 +++---- .../repository/StorageConfigRepository.java | 8 ++-- .../zfile/service/StorageConfigService.java | 6 ++- .../base/AbstractOneDriveServiceBase.java | 41 ++++++++++++------- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/main/java/im/zhaojun/zfile/config/OneDriveConfig.java b/src/main/java/im/zhaojun/zfile/config/OneDriveConfig.java index 6de1c1f..a31bd8a 100644 --- a/src/main/java/im/zhaojun/zfile/config/OneDriveConfig.java +++ b/src/main/java/im/zhaojun/zfile/config/OneDriveConfig.java @@ -8,11 +8,13 @@ import im.zhaojun.zfile.service.impl.OneDriveChinaServiceImpl; import im.zhaojun.zfile.service.impl.OneDriveServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.Collections; +import java.util.LinkedList; /** * @author zhaojun @@ -38,18 +40,11 @@ public class OneDriveConfig { RestTemplate restTemplate = new RestTemplate(); ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, clientHttpRequestExecution) -> { - String host = httpRequest.getURI().getHost(); - StorageTypeEnum type; - if (oneDriveChinaServiceImpl.getGraphEndPoint().contains(host)) { - type = StorageTypeEnum.ONE_DRIVE_CHINA; - } else if (oneDriveServiceImpl.getGraphEndPoint().contains(host)) { - type = StorageTypeEnum.ONE_DRIVE; - } else { - return clientHttpRequestExecution.execute(httpRequest, bytes); - } + HttpHeaders headers = httpRequest.getHeaders(); + Integer driveId = Integer.valueOf(((LinkedList)headers.get("driveId")).get(0).toString()); StorageConfig accessTokenConfig = - storageConfigService.selectByTypeAndKey(type, StorageConfigConstant.ACCESS_TOKEN_KEY); + storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY); String tokenValue = String.format("%s %s", "Bearer", accessTokenConfig.getValue()); httpRequest.getHeaders().add("Authorization", tokenValue); diff --git a/src/main/java/im/zhaojun/zfile/repository/StorageConfigRepository.java b/src/main/java/im/zhaojun/zfile/repository/StorageConfigRepository.java index a62577f..64ff0aa 100644 --- a/src/main/java/im/zhaojun/zfile/repository/StorageConfigRepository.java +++ b/src/main/java/im/zhaojun/zfile/repository/StorageConfigRepository.java @@ -56,16 +56,16 @@ public interface StorageConfigRepository extends JpaRepository selectStorageConfigByDriveId(Integer driveId) { return storageConfigRepository.findByDriveIdOrderById(driveId); } - public StorageConfig selectByTypeAndKey(StorageTypeEnum storageType, String key) { - return storageConfigRepository.findByTypeAndKey(storageType, key); + + public StorageConfig findByDriveIdAndKey(Integer driveId, String key) { + return storageConfigRepository.findByDriveIdAndKey(driveId, key); } diff --git a/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java b/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java index 3acf241..c2e0bf0 100644 --- a/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java +++ b/src/main/java/im/zhaojun/zfile/service/base/AbstractOneDriveServiceBase.java @@ -4,7 +4,6 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import im.zhaojun.zfile.model.constant.StorageConfigConstant; @@ -18,13 +17,17 @@ import im.zhaojun.zfile.service.StorageConfigService; import im.zhaojun.zfile.util.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; -import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -62,7 +65,7 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic */ public OneDriveToken getRefreshToken() { StorageConfig refreshStorageConfig = - storageConfigRepository.findByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.REFRESH_TOKEN_KEY); + storageConfigRepository.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); String param = "client_id=" + getClientId() + "&redirect_uri=" + getRedirectUri() + @@ -124,18 +127,23 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic } fullPath = StringUtils.removeLastSeparator(fullPath); - ResponseEntity responseEntity; + JSONObject root; + + HttpHeaders headers = new HttpHeaders(); + headers.set("driveId", driveId.toString()); + HttpEntity entity = new HttpEntity<>(headers); + try { - responseEntity = oneDriveRestTemplate.getForEntity(requestUrl, String.class, getGraphEndPoint(), fullPath); + root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); } catch (HttpClientErrorException e) { log.debug("调用 OneDrive 时出现了网络异常: {} , 已尝试重新刷新 token 后再试.", e.getMessage()); refreshOneDriveToken(); - responseEntity = oneDriveRestTemplate.getForEntity(requestUrl, String.class, getGraphEndPoint(), fullPath); + root = oneDriveRestTemplate.exchange(requestUrl, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); } - String body = responseEntity.getBody(); - - JSONObject root = JSON.parseObject(body); + if (root == null) { + return Collections.emptyList(); + } nextLink = root.getString("@odata.nextLink"); @@ -171,10 +179,15 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic String requestUrl; - ResponseEntity responseEntity = oneDriveRestTemplate.getForEntity(DRIVER_ITEM_URL, String.class, getGraphEndPoint(), fullPath); - String body = responseEntity.getBody(); + HttpHeaders headers = new HttpHeaders(); + headers.set("driveId", driveId.toString()); + HttpEntity entity = new HttpEntity<>(headers); - JSONObject fileItem = JSON.parseObject(body); + JSONObject fileItem = oneDriveRestTemplate.exchange(DRIVER_ITEM_URL, HttpMethod.GET, entity, JSONObject.class, getGraphEndPoint(), fullPath).getBody(); + + if (fileItem == null) { + return null; + } FileItemDTO fileItemDTO = new FileItemDTO(); fileItemDTO.setName(fileItem.getString("name")); @@ -213,9 +226,9 @@ public abstract class AbstractOneDriveServiceBase extends AbstractBaseFileServic } StorageConfig accessTokenConfig = - storageConfigService.selectByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.ACCESS_TOKEN_KEY); + storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.ACCESS_TOKEN_KEY); StorageConfig refreshTokenConfig = - storageConfigService.selectByTypeAndKey(this.getStorageTypeEnum(), StorageConfigConstant.REFRESH_TOKEN_KEY); + storageConfigService.findByDriveIdAndKey(driveId, StorageConfigConstant.REFRESH_TOKEN_KEY); accessTokenConfig.setValue(refreshToken.getAccessToken()); refreshTokenConfig.setValue(refreshToken.getRefreshToken());