服务端签名后直传

  • 1.背景
  • 2.原理介绍
  • 3.OSS中的相关概念
  • 4.编码
  • 5.源码地址
  • 6.博客地址
  • 7.码云代码地址

1.背景

采用JavaScript客户端直接签名时,AccessKeyID和AcessKeySecret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。

2.原理介绍


服务端签名后直传的原理如下:

1.用户发送上传Policy请求到应用服务器。
2.应用服务器返回上传Policy和签名给用户。
3.用户直接上传数据到OSS。

本示例中,Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。但本示例中的服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户上传了什么文件,可以采用服务端签名直传并设置上传回调。详见下片文章阿里oss服务端签名直传并设置上传回调。

官方文档地址:服务端签名后直传

3.OSS中的相关概念

Endpoint:访问域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。
AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。

之前有一篇文章已经介绍了各个参数的位置。如有不知道的,请看这篇springboot整合oss实现文件的上传,查看,删除,下载

4.编码

在pom.xml中添加相关依赖

<!-- OSS SDK 相关依赖 --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.5.0</version></dependency>

修改SpringBoot配置文件

server:port: 80
# OSS相关配置信息
aliyun:oss:endpoint: endpoint # oss对外服务的访问域名accessKeyId: accessKeyId # 访问身份验证中用到用户标识accessKeySecret: accessKeySecret # 用户用于加密签名字符串和oss用来验证签名字符串的密钥bucketName: tuanzi-ne # oss的存储空间policy:expire: 300 # 签名有效期(S)maxSize: 10 # 上传文件大小(M)dir:prefix: tuanzi/images/   # 上传文件夹路径前缀

添加OSS的相关Java配置

用于配置OSS的连接客户端OSSClient。
package com.tuanzi.config;import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** oss配置文件* @auther 团子* @date 2019-07-31 10:03*/
@Configuration
@Data
public class OssConfig {@Value("${aliyun.oss.endpoint}")private String ALIYUN_OSS_ENDPOINT;@Value("${aliyun.oss.accessKeyId}")private String ALIYUN_OSS_ACCESSKEYID;@Value("${aliyun.oss.accessKeySecret}")private String ALIYUN_OSS_ACCESSKEYSECRET;@Beanpublic OSSClient ossClient(){return new OSSClient(ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_ACCESSKEYID, ALIYUN_OSS_ACCESSKEYSECRET);}
}

添加OSS上传策略封装对象OssPolicyResult

前端直接上传文件时所需参数,从后端返回过来。
package com.tuanzi.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;/*** 获取OSS上传文件授权返回结果* @auther 团子* @date 2019-07-31 11:31*/@Data
public class OssPolicyResult {@ApiModelProperty("访问身份验证中用到用户标识")private String accessKeyId;@ApiModelProperty("用户表单上传的策略,经过base64编码过的字符串")private String policy;@ApiModelProperty("对policy签名后的字符串")private String signature;@ApiModelProperty("上传文件夹路径前缀")private String dir;@ApiModelProperty("oss对外服务的访问域名")private String host;
}

添加OssController定义接口

/*** Oss相关操作接口* @auther 团子* @date 2019-07-31 11:31*/@Controller
@Api(tags = "OssController", description = "Oss管理")
@RequestMapping("/aliyun/oss")
public class OssController {public static final Logger logger = LoggerFactory.getLogger(OssController.class);@Autowiredprivate OssServiceImpl ossService;@ApiOperation(value = "oss上传签名生成")@RequestMapping(value = "/policy", method = RequestMethod.GET)@ResponseBodypublic CommonResult<OssPolicyResult> policy() {logger.info("policy --------------> start");OssPolicyResult result = ossService.policy();logger.info("policy --------------> end");return CommonResult.success(result);}}

添加OSS业务接口OssService

/*** oss上传管理Service* @auther 团子* @date 2019-07-31 11:31*/public interface OssService {/*** oss上传策略生成*/OssPolicyResult policy();}

添加OSS业务接口OssService的实现类OssServiceImpl

    private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);@Value("${aliyun.oss.policy.expire}")private int ALIYUN_OSS_EXPIRE;@Value("${aliyun.oss.maxSize}")private int ALIYUN_OSS_MAX_SIZE;@Value("${aliyun.oss.bucketName}")private String ALIYUN_OSS_BUCKET_NAME;@Value("${aliyun.oss.endpoint}")private String ALIYUN_OSS_ENDPOINT;@Value("${aliyun.oss.dir.prefix}")private String ALIYUN_OSS_DIR_PREFIX;@Autowiredprivate OSSClient ossClient;/*** 签名生成*/@Overridepublic OssPolicyResult policy() {OssPolicyResult result = new OssPolicyResult();// 存储目录SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String dir = ALIYUN_OSS_DIR_PREFIX+sdf.format(new Date());// 签名有效期long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;Date expiration = new Date(expireEndTime);// 文件大小long maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024;// 提交节点String action = "http://" + ALIYUN_OSS_BUCKET_NAME + "." + ALIYUN_OSS_ENDPOINT;try {PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String policy = BinaryUtil.toBase64String(binaryData);String signature = ossClient.calculatePostSignature(postPolicy);result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());result.setPolicy(policy);result.setSignature(signature);result.setDir(dir);result.setHost(action);} catch (Exception e) {LOGGER.error("签名生成失败", e);}return result;}

这样我们就全写完了。我们来进行接口测试!
这里我利用postman进行演示

会调用两次请求,第一次访问本地接口获取上传的策略

第二次调用oss服务 的接口进行文件上传

我们再来看看oss管理控制台

5.源码地址

完整源码地址:阿里oss服务端签名后直传

6.博客地址

博客地址

7.码云代码地址

代码地址

阿里oss服务端签名后直传相关推荐

  1. oss服务端签名后直传分析与代码实现

    文章目录 1.简介 1.1 普通上传方式 1.2 服务端签名后直传 3.服务端签名后直传文档 3.1 用户向应用服务器请求上传Policy和回调. 3.2 应用服务器返回上传Policy和签名给用户. ...

  2. 阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)

    分片上传(结合element-ui的upload组件实现自定义上传) async uploadFree(content){let data = await this.getOssToken(); // ...

  3. 阿里云oss文件上传(简单上传、服务端签名后直传)

    前置: 自行开通阿里oss服务: https://www.aliyun.com/product/oss?spm=a2c4g.11174283.J_8058803260.125.d9387da2TjNf ...

  4. 商城项目09_品牌管理菜单、快速显示开关、阿里云进行文件上传、结合Alibaba管理OSS、服务端签名后直传

    文章目录 ①. 品牌管理菜单 ②. 快速显示开关 ③. 阿里云上传概述 ④. 使用代码进行文件上传 ⑤. 结合Alibaba来管理oss ⑥. gulimall-third-party微服务 ⑦. 服 ...

  5. 分布式电商项目二十六:使用阿里云存储的服务端签名后直传(前端联调)

    使用阿里云存储的服务端签名后直传(前端联调) 在前端显示上传的界面,可以根据人人fast-vue的结构,在src\components目录下添加upload文件夹,直接添加vue组件即可,总计三个组件 ...

  6. java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS

    继续上一章文章,这次要操作的是,浏览器请求服务要到签名后直传给OSS对象存储. 1.写好服务端的方法,传给前台相应的密钥 @Resource OSSClient ossClient; @Value(& ...

  7. 【OSS】服务端签名后直传实现阿里云存储上传文件

    文章目录 1.前言 2.阿里云OSS 2.1.开通服务 2.2.创建Bucket 2.3.创建子账户 3.服务端 3.1.依赖导入 3.2.配置文件 3.3.控制器编写 3.4.接口测试 4.前端联调 ...

  8. 阿里云OSS服务端签名前端JS直传(php)示例

    阿里云OSS服务端签名后前端JS直传(php)示例 需求:服务端上传图片太慢,需要使用前端直传的方式.但前端把阿里云的 AccessKey ID 和 AccessKey Secret 放在前端文件中会 ...

  9. oss 服务端签名直传核心代码

    OSS 相关配置 spring:cloud:alicloud:access-key: XXXXXXXsecret-key: XXXXXXXoss:endpoint: XXXXXXXbucket: pi ...

  10. 微信小程序:阿里云OSS直传实践-PHP实现服务端签名

    目录 1.阿里云OSS上传方式 1.1.Web端Browser.js SDK直传(不推荐) 1.2.Web端上传服务端再上传至OSS 1.3.服务端签名后Web端直传(推荐) 2.PHP服务端生成签名 ...

最新文章

  1. 微软System Center 2012推进私有云计算
  2. linux 多源代码文件编译
  3. 求矩阵中各列数字的和 Exercise08_01
  4. Django ajax 检测用户名是否已被注册
  5. TyepScript入门教程 之 async await
  6. Linux下配置CentOS7网络设置 获取ip地址
  7. js触发click事件
  8. 推荐一款颜值逆天且功能齐全的开源Shell工具
  9. c语言中的字符数组和字符串之间的关系
  10. 深度学习语音降噪方法对比_一种语音降噪方法与流程
  11. 微服务下蓝绿发布、滚动发布、灰度发布等方案
  12. 考研英语二2017阅读理解Text3
  13. Django项目 | 使用MongoDB存储图片
  14. GitHub 为什么很慢很卡
  15. 詹姆斯高斯林_Oracle-谷歌专利纠纷不让詹姆斯·高斯林惊讶
  16. 和菜头-和腾讯新闻哥谈谈腾讯价值观
  17. 文件:因为懂你,所以永恒 +习题复习
  18. 直观理解拉格朗日乘子法和Karush-Kuhn-Tucker(KKT)条件
  19. Nginx-正向代理
  20. 列表过滤(百度搜索框用vue来实现)

热门文章

  1. 键盘键码keyCode对照表
  2. Django 开发收银系统六
  3. 自动化专业考研方向简介
  4. html 多选框取值,多选框取值
  5. golang微服务网关
  6. Java已经27岁了!黑马Java均薪破万,最高28K!
  7. MacBooster CleanMyMac CCleaner三款Mac清理工具该如何选择
  8. 985翻译硕士都在找的这款软件
  9. QT之信号和槽机制详解
  10. 自抗扰控制器-1.跟踪微分器 TD