- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有基于Azure服务的eclispe maven项目。我想在来自另一个国家的客户计算机上运行它,因此有不同的时区。
当我在他们的机器上安装 eclipse 并运行所有服务时,这些工作正常。但是当我将 war 添加到 apache 文件夹时,运行它后,它会给出如下错误:
Make sure the value of Authorization header is formed correctly including the signature.
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:)
我来到此链接,我认为我遇到了几乎相同类型的错误:
StorageException for azure blob with java
请告诉我如何解决这个问题以及如何使时钟“变慢”,如提供的链接的答案中所述。
这是代码:(请参阅第一个方法中 else 循环中的代码。这是与 blob 相关的代码。)
@Override
public JSONObject syncFiles(JSONObject jsonInput) throws InvalidKeyException, URISyntaxException {
if (jsonInput.containsKey("accountName")) {
CloudFileClient fileClient = null;
String storageConnectionString = "DefaultEndpointsProtocol=https;AccountName="
+ jsonInput.get("accountName") + ";" + "AccountKey=" + jsonInput.get("accountKey");
System.out.println(storageConnectionString);
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
JSONObject jsonOutput = new JSONObject();
ArrayList fileList = new ArrayList<>();
try {
// fileClient =
// FileClientProvider.getFileClientReference(jsonOutput);
fileClient = storageAccount.createCloudFileClient();
String directoryName = jsonInput.get("directoryStructure").toString();
String[] directoryNameArray = directoryName.split("\\s*/\\s*");
System.out.println(directoryNameArray.length);
CloudFileShare share = fileClient.getShareReference(directoryNameArray[0].toLowerCase()
.replaceAll("[-+.^:,!@#$%&*()_~`]", "").replaceAll("\\s+", ""));
if (share.createIfNotExists()) {
System.out.println("New share created named as " + directoryNameArray[0].toLowerCase()
.replaceAll("[-+.^:,!@#$%&*()_~`]", "").replaceAll("\\s+", ""));
}
CloudFileDirectory rootDir = share.getRootDirectoryReference();
for (int i = 0; i < directoryNameArray.length; i++) {
String directoryToCreate = directoryNameArray[i];
CloudFileDirectory directory = rootDir.getDirectoryReference(directoryToCreate);
String directoryNameToListFiles = directory.getName();
if (i == directoryNameArray.length - 1) {
for (ListFileItem fileItem : directory.listFilesAndDirectories()) {
boolean isDirectory;
if (isDirectory = fileItem.getClass() == CloudFileDirectory.class) {
System.out.println("Directory Exists Here");
} else {
System.out.println("Name with files :" + fileItem.getUri().toString());
String downloadLocation = "/home/zcon/AzureDownloadedFiles";
String fileName[] = fileItem.getUri().toString().split("\\s*/\\s*");
for (int j = 0; j < fileName.length; j++) {
if (j == fileName.length - 1) {
String fileNameWithExtension = fileName[j];
File f = new File(downloadLocation + "/" + fileNameWithExtension);
String DownloadTo = f.toString();
f.createNewFile();
CloudFile cloudFile = directory
.getFileReference(fileNameWithExtension.replaceAll("%20", " "));
System.out.println("fileName===========" + fileNameWithExtension);
String tokenKey = testFileSAS(share, cloudFile);
cloudFile.downloadToFile(DownloadTo);
fileList.add(fileItem.getUri().toString() + "?" + tokenKey);
f.delete();
}
}
}
}
}
rootDir = directory;
}
ArrayList fileNamesList = new ArrayList<>();
for (int i = 0; i < fileList.size(); i++) {
String fileName[] = fileList.get(i).toString().split("\\s*/\\s*");
for (int j = 0; j < fileName.length; j++) {
if (j == fileName.length - 1) {
String fileNameReturn = fileName[j];
String[] fileNameReturnArray = fileNameReturn.split("\\.");
fileNamesList.add(fileNameReturnArray[0].replace("%20", " "));
}
}
}
jsonOutput.put("fileNamesList", fileNamesList);
jsonOutput.put("fileList", fileList);
jsonOutput.put("status", "successful");
} catch (Exception e) {
System.out.println("Exception is " + e.toString());
jsonOutput.put("status", "unsuccessful");
jsonOutput.put("exception", e.toString());
e.printStackTrace();
}
return jsonOutput;
} else {
CloudBlobClient blobClient = null;
String storageConnectionString = "DefaultEndpointsProtocol=https;AccountName="
+ jsonInput.get("blobAccountName") + ";" + "AccountKey=" + jsonInput.get("blobAccountKey");
System.out.println(storageConnectionString);
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
JSONObject jsonOutput = new JSONObject();
ArrayList fileList = new ArrayList<>();
ArrayList fileNamesList = new ArrayList<>();
ArrayList blobItemList = new ArrayList<>();
try {
blobClient = storageAccount.createCloudBlobClient();
String directoryName = jsonInput.get("directoryStructure").toString();
String[] directoryNameArray = directoryName.split("\\s*/\\s*");
CloudBlobContainer container = blobClient.getContainerReference(directoryNameArray[0].toLowerCase()
.replaceAll("[-+.^:,!@#$%&*()_~`]", "").replaceAll("\\s+", ""));
if (container.createIfNotExists()) {
System.out.println("New share created named as " + directoryNameArray[0].toLowerCase()
.replaceAll("[-+.^:,!@#$%&*()_~`]", "").replaceAll("\\s+", ""));
}
// CloudBlockBlob blob =
// container.getBlockBlobReference(jsonInput.get("directoryStructure")+"/"+jsonInput.get("fileToCopy"));
CloudBlobDirectory directoryOfFile = container
.getDirectoryReference(jsonInput.get("directoryStructure").toString());
for (ListBlobItem blobItem : directoryOfFile.listBlobs()) {
// System.out.println(blobItem.getUri());
// fileList.add(blobItem.getUri());
blobItemList.add(blobItem);
}
for(int q= 0; q<blobItemList.size(); q++){
if(blobItemList.get(q).getClass()==CloudBlobDirectory.class)
{
blobItemList.remove(q);
}
}
System.out.println(blobItemList);
for (int l = 0; l < blobItemList.size(); l++) {
CloudBlob blob = (CloudBlob) blobItemList.get(l);
if (blob.getUri().toString().contains("Temp.txt")) {
System.out.println("Temp file was skipped");
} else {
String tokenKey = testBlobSaS(blob, container);
fileList.add(blob.getUri().toString() + "?" + tokenKey);
}
}
System.out.println("size of blobItemList is=============" + blobItemList.size());
for (int k = 0; k < fileList.size(); k++) {
String fileItem = fileList.get(k).toString();
String fileName[] = fileItem.split("\\s*/\\s*");
for (int j = 0; j < fileName.length; j++) {
if (j == fileName.length - 1) {
String fileNameWithExtension = fileName[j];
String[] parts = fileNameWithExtension.split("\\?");
System.out.println("fileName===========" + fileNameWithExtension);
fileNamesList.add(parts[0].replace("%20", " "));
}
}
}
jsonOutput.put("fileList", fileList);
jsonOutput.put("fileNamesList", fileNamesList);
jsonOutput.put("status", "successful");
System.out.println(fileList);
return jsonOutput;
} catch (Exception e) {
System.out.println("Exception is " + e.toString());
jsonOutput.put("status", "unsuccessful");
jsonOutput.put("exception", e.toString());
e.printStackTrace();
}
return jsonOutput;
}
}
创建 BlobSAS 的方法:
@Test
// @Category(SlowTests.class)
public String testBlobSaS(CloudBlob blob, CloudBlobContainer container) throws InvalidKeyException,
IllegalArgumentException, StorageException, URISyntaxException, InterruptedException {
SharedAccessBlobPolicy sp = createSharedAccessBlobPolicy(
EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.LIST), 100);
BlobContainerPermissions perms = new BlobContainerPermissions();
perms.getSharedAccessPolicies().put("readperm", sp);
container.uploadPermissions(perms);
// Thread.sleep(30000);
String sas = blob.generateSharedAccessSignature(sp, null);
CloudBlockBlob sasBlob = new CloudBlockBlob(
new URI(blob.getUri().toString() + "?" + blob.generateSharedAccessSignature(null, "readperm")));
sasBlob.download(new ByteArrayOutputStream());
// do not give the client and check that the new blob's client has the
// correct perms
CloudBlob blobFromUri = new CloudBlockBlob(
PathUtility.addToQuery(blob.getStorageUri(), blob.generateSharedAccessSignature(null, "readperm")));
assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
blobFromUri.getServiceClient().getCredentials().getClass().toString());
// create credentials from sas
StorageCredentials creds = new StorageCredentialsSharedAccessSignature(
blob.generateSharedAccessSignature(null, "readperm"));
CloudBlobClient bClient = new CloudBlobClient(sasBlob.getServiceClient().getStorageUri(), creds);
CloudBlockBlob blobFromClient = bClient.getContainerReference(blob.getContainer().getName())
.getBlockBlobReference(blob.getName());
assertEquals(StorageCredentialsSharedAccessSignature.class.toString(),
blobFromClient.getServiceClient().getCredentials().getClass().toString());
assertEquals(bClient, blobFromClient.getServiceClient());
return sas;
}
创建共享访问 blob 策略的方法:
private final static SharedAccessBlobPolicy createSharedAccessBlobPolicy(EnumSet<SharedAccessBlobPermissions> sap,
int expireTimeInSeconds) {
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(new Date());
cal.add(Calendar.YEAR, expireTimeInSeconds);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
policy.setPermissions(sap);
policy.setSharedAccessExpiryTime(cal.getTime());
return policy;
}
我应该在这里进行哪些更改?
最佳答案
我以前也遇到过类似的问题。你需要做的是,让你的代码适合所有时区,如 GMT、IST、EST 等。因为当你在另一个国家的服务器上上传 war 时,你的代码必须足够“聪明”才能理解该国家的时区!
因此,您可以执行以下操作:
第 1 步:
在代码的第三部分,尝试用客户端计算机的时区(例如 GMT、EST 等)替换“UTC”。
如果有效(而且我非常确定它会正常工作),请继续
第 2 步:
首先,我们将编写一些代码,以字符串形式为您提供当前时区,例如“印度标准时间”或“欧洲标准时间”等。
然后,我们将从所有单词中仅选取第一个字母,并创建一个类似“IST”或“EST”的字符串。
最后,我们将在代码第三部分中写入“UTC”的位置传递此字符串。
所以,这是代码:
private final static SharedAccessBlobPolicy createSharedAccessBlobPolicy(EnumSet<SharedAccessBlobPermissions> sap,
int expireTimeInSeconds) {
Calendar now = Calendar.getInstance();
TimeZone timeZone = now.getTimeZone();
System.out.println("Current TimeZone is : " + timeZone.getDisplayName());
String x = timeZone.getDisplayName();
String[] myName = x.split(" ");
String s = "";
ArrayList zoneArray = new ArrayList<>();
char zone = 0;
for (int i = 0; i < myName.length; i++) {
s = myName[i];
System.out.print(s.charAt(0));
zone = s.charAt(0);
zoneArray.add(zone);
}
String timeZoneCurrent = s;
String timeZoneDynamic = zoneArray.toString().replace(",", "").replace(" ", "").replace("[", "").replace("]",
"");
System.out.println("Value of S==========" + timeZoneDynamic);
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone(timeZoneDynamic));
cal.setTime(new Date());
cal.add(Calendar.YEAR, expireTimeInSeconds);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
policy.setPermissions(sap);
policy.setSharedAccessExpiryTime(cal.getTime());
return policy;
}
在此,timeZoneDynamic 具有“IST”、“GMT”等值。此逻辑必须有效。如果有任何错误,请在编辑中发布。希望这会起作用。
关于java - 如何在来自其他国家/地区的客户端计算机上运行 war 文件而不出现与时钟/签名相关的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906619/
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在我的 MVC 应用程序中,我想显示用户访问网站的国家/地区、地区和城市。我怎样才能获取它们? 最佳答案 有几种方法。一种是要求用户与远程服务器共享他的位置。 https://developer.mo
有人知道Firebase电话身份验证是否适用于印度电话号码吗? 我成功实现并使用了美国号码(+1xxxxxxxxxx),但是尝试使用印度电话号码时未收到文本。不确定是否无法正常工作,或者我丢失了某些东
配置:OY01 定义国家/地区 事务代码:OY01 配置路径 SPRO-ABAP平台-常规设置-设置国家-定义国家/地区 配置路径截图 配置描述 国家是SAP里面一个非常重要的概念,S
我想知道网站的原始国家/地区。我注意到Alexa网站通常可以检测网站的原始国家/地区。例如,Alexa可以检测到stackoverflow.com网站的原始国家/地区是美国,依此类推。 Alexa如何
我有一些文本,其中可能包含也可能不包含国家/地区名称。例如: ' Nigeria: Hotspot Network LTD Rural Telephony Feasibility Study' 这就是
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我有一组值,它们是我的 ajax 调用中的国家/地区代码 Handler.getCountryIdparam1, {callback:function(data){ // data will
我在我的应用程序中使用谷歌地点。一切正常,但我只想从输入中删除或忽略国家/地区。 例如,如果输入“arc”我有 Arcachon, France Arcueil, France Archamps, F
在 firebase 中创建项目时,我错误地选择了错误的国家/地区。 正如您在这里看到的: 这个问题可以解决吗? (我知道项目 ID 无法更改,而且我喜欢我选择的 ID...) 最佳答案 如the d
我有一个名为“Login”的Hive表。它包含以下列: UserID | UserName | UserIP | UserCountry | Date 在特定的一天(当天的所有登录信息),我想找出用户
我正在使用谷歌地图和地理编码API来检索用户输入邮政编码/邮政编码后的纬度/经度,但我想将邮政编码/邮政编码限制为该用户所在的国家/地区,这样我就不会得到结果多个结果。 是否有一种方法可以使用 jqu
是否可以获得维基百科上所有有关系的国家、地区和城市的列表?我找不到任何适合此任务的 API。解析我需要的所有信息的最简单方法是什么?PS:我知道,我可以从其他数据源获取此信息。但我对维基百科感兴趣..
我正在用两种语言制作一个网站。是否可以检查用户位于哪个国家,以便我可以自动为用户切换语言?我的菜单中还有一个带有 _GET 的切换选项。我一开始有这段代码: if (isset($_GET['taal
这是我的 Firebase 数据库结构: 看起来就是这样。有国家和用户。如果用户访问过某个国家/地区,则该国家/地区将存储在该用户的“VisitedCountries”子项中。例如用户 Angelin
这个问题在这里已经有了答案: Convert latitude and longitude coordinates to country name in R (2 个回答) 关闭9年前. 我有一个带有
我目前正在开发我的第一个iOS应用(phonegap / cordova)。我想知道是否需要采取某些步骤,以使其不仅可用于德国应用程序商店(这是我的语言),还可以提供给国际应用程序? 最佳答案 不,你
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
背景 我目前正在开发一个向用户提问的 Android 应用程序。目前我正在创建用于提问的模块。现在我正在开发一个地形模块,它将能够向用户询问有关某个国家/地区的各种问题,并向他们显示。 问题 对于本模
我正在使用 Cloudera 的 TwitterSource for Flume。我想按国家/地区获取具有某些关键字的推文。当我想获取来自荷兰的推文时,我不知道该与什么进行比较。我有以下结果,但没有任
我是一名优秀的程序员,十分优秀!