onlyoffice api开发

news2025/1/20 19:28:48

编写代码

按照https://api.onlyoffice.com/editors/basic编写代码

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>01</title>
</head>
<body style="height: 100%;margin: 0;">
<div id="placeholder"></div>
<script type="text/javascript" src="http://10.10.90.139:8099/web-apps/apps/api/documents/api.js"></script>
<script type="text/javascript">
    config = {
        "document": {
            "fileType": "docx",
            "key": "CcauAgYYjWkLrMqqwACZ",
            "title": "测试01.docx",
            "url": "http://10.10.90.139:8849/uploads/onlyoffice01.docx"
        },
        "documentType": "word",
        "editorConfig": {
            "callbackUrl": ""
        }
    };
    var docEditor = new DocsAPI.DocEditor("placeholder", config);
</script>
</body>
</html>

其中http://10.10.90.139:8099是onlyoffice部署的地址
访问页面报错
在这里插入图片描述
两种解决方案

去掉jwt验证

将local.json里面 的token下的inbox、outbox、browser值改为false。

"token": { "enable": { "request": { "inbox": false, "outbox": false }, "browser": false },

然后重启下服务。命令:systemctl restart ds-*
windows下重启onlyoffice

添加token

新建asp.net core 空项目
安装JWT和Newtonsoft.json
在这里插入图片描述
修改Program

namespace OnlyOfficeStu02;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddControllers();
        var app = builder.Build();

        app.UseRouting();
        app.UseDefaultFiles();
        app.UseStaticFiles();
        app.MapControllers();
        app.Run();
    }
}

新建JwtManager

using JWT;
using JWT.Algorithms;
using JWT.Builder;
using JWT.Serializers;

namespace OnlyOfficeStu02.Utils;

public static class JwtManager
{
    private static readonly string Secret;
    public static readonly bool Enabled;
    public static readonly bool SignatureUseForRequest;

    static JwtManager()
    {
        Secret = "A4DgWFYPE6ILYOGH2tGlnkYeW0u1zp";  // get token secret from the config parameters
        Enabled = !string.IsNullOrEmpty(Secret);  // check if the token is enabled
        SignatureUseForRequest = true;
    }

    // encode a payload object into a token using a secret key
    public static string Encode(IDictionary<string, object> payload)
    {
        var encoder = new JwtEncoder(new HMACSHA256Algorithm(),
            new JsonNetSerializer(),
            new JwtBase64UrlEncoder());
        return encoder.Encode(payload, Secret);
    }

    public static string Encode(string payload)
    {
        var encoder = new JwtEncoder(new HMACSHA256Algorithm(),
            new JsonNetSerializer(),
            new JwtBase64UrlEncoder());
        return encoder.Encode(payload, Secret);
    }
    
    // decode a token into a payload object using a secret key
    public static string Decode(string token)
    {
        if (!Enabled || string.IsNullOrEmpty(token)) return "";

        return JwtBuilder.Create()
            .WithAlgorithm(new HMACSHA256Algorithm())
            .WithSecret(Secret)
            .MustVerifySignature()
            .Decode(token);
    }
}

新建IndexController

using Microsoft.AspNetCore.Mvc;
using OnlyOfficeStu02.Models;
using OnlyOfficeStu02.Utils;

namespace OnlyOfficeStu02.Controllers;

/// <summary>
/// 首页控制器
/// </summary>
[ApiController]
[Route("[Controller]/[Action]")]
public class IndexController : ControllerBase
{
    /// <summary>
    /// 构造函数注入
    /// </summary>
    public IndexController()
    {
    }

    /// <summary>
    /// jwt编码
    /// </summary>
    /// <param name="param"></param>
    /// <returns></returns>
    [HttpPost]
    public IActionResult JwtEncode([FromBody]JwtEncodeParamModel param)
    {
        var jwtStr = JwtManager.Encode(param.JsonStr);
        return new JsonResult(new JwtEncodeViewModel
        {
            Jwt = jwtStr
        });
    }
    
    /// <summary>
    /// 回调相应
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    public IActionResult CallBack()
    {
        var res = new CallBackViewModel();
        res.Error = 0;
        return new JsonResult(res);
    }
}

wwwroot下新增index.html

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>01</title>
</head>
<body style="height: 100%;margin: 0;">
<div id="placeholder"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
<script type="text/javascript" src="http://10.10.90.139:8099/web-apps/apps/api/documents/api.js"></script>
<script type="text/javascript">
    const config = {
        "document": {
            "fileType": "docx",
            "key": "CcauAgYYjWkLrMqqwACZ",
            "title": "测试01.docx",
            "url": "http://10.10.90.139:8849/uploads/onlyoffice01.docx",
            // 权限,每个要打开的文档都可以设置独立的权限
            "permissions": {
                // 启用评论
                "comment": false,
                // 启用下载
                "download": false,
                // 启用编辑
                "edit": false,
                // 启用导出
                "print": false,
                // 启用预览
                "review": true
            }
        },
        "documentType": "word",
        "editorConfig": {
            "callbackUrl": "/index/callback",
            // 设置语言
            "lang": "zh-CN",
            // 添加用户信息
            "user": {
                "group": "技术部",
                "id": "wjl",
                "name": "wjl"
            },
        }
    };
    $(function () {
        const configJsonStr = JSON.stringify(config);
        $.ajax({
            type: "POST",
            url: "/index/jwtencode",
            contentType: "application/json",
            data: JSON.stringify({
                "jsonStr":configJsonStr
            }),
            dataType: "json",
            success: function (data) {
                console.log("成功")
                console.log(data)
                if(data.jwt){
                    config.token = data.jwt;
                    var docEditor = new DocsAPI.DocEditor("placeholder", config);
                }
            },
            error: function (err) {
                console.error(err);
            }
        })
        
    })
</script>
</body>
</html>

启动项目访问
在这里插入图片描述

参考

token获取
常见问题
java问题
onlyoffice jwt
onlyoffice jwt
onlyoffice 签名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1469706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

长短连接对压测的影响有多大

【引言】 当我们进行压力测试时&#xff0c;长短连接是一个非常重要的参数。但是&#xff0c;你知道吗&#xff1f;长短连接对于压测结果有着非常大的影响&#xff01;如果你不理解这个参数&#xff0c;那么你的压测结果可能会出现严重的偏差。 在这篇文章中&#xff0c;我将…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家&#xff0c;我打开自己的项目&#xff0c;执行&#xff1a; cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码&#xff0c;然后更新依赖&#xff0c;最后开始今晚的开发时候&#xff0c;意外发生了&#xff0c;竟然报错了&#xff0c;…

吴恩达deeplearning.ai:Tensorflow训练一个神经网络

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai 在之前的博客中。我们陆续学习了各个方面的有关深度学习的内容&#xff0c;今天可以从头开始训练一个神经网络了。 Tensorflow训练神经网络模型 我们使用之前用过的例子&#xff1a; 这个神经…

软件开发的艺术与科学

随着科技的飞速发展&#xff0c;软件开发已成为当今社会不可或缺的一部分。从智能手机应用程序到企业级管理系统&#xff0c;软件开发已经渗透到我们生活的方方面面。本文将探讨软件开发的重要性和现状&#xff0c;以及开发过程中涉及的关键环节和常见问题。 一、软件开发的重…

leetcode:491.递增子序列

1.误区&#xff1a;不能直接对数组排序再求解子集&#xff0c;因为那样就改变了原有数组的顺序 2.树形结构&#xff1a;一个一个取数&#xff0c;然后保证是递增序列&#xff0c;且不能重复。&#xff08;数层上不可以重复取&#xff0c;树枝上可以重复取&#xff09;收集的结…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高&#xff0c;Kotlin 当一个图片放在ImageView里面后&#xff0c;用以下方式获取图的宽高&#xff1a; val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

SpringBoot实现缓存预热方案

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。 那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢? 实现方案概述 在 Spring Boot 启动之后,可以通过以下手段实现缓存预热: 使用…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木&#xff0c;让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0c;每天向右修剪一棵灌木。当修剪了最右侧的灌木后&#xff0c;她会…

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;

Java 存图方式

图最常见的两种存储方式是邻接表和邻接矩阵。 链式前向星其实就是静态建立的邻接表,时间效率为 O(n),空间效率也为 O(n)。遍历效率也为 O(n)。 一、邻接表 邻接表存储方式适合存储边稀疏的图,判断两点之间是否有边不方便; 邻接矩阵适合存储边稠密的,判断边和权值都很方…

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

使用Django的admin功能管理数据_vscode

之前的文章 项目 hello_django, app名 hello&#xff0c;已有的model LogMessage&#xff1a; https://blog.csdn.net/weixin_44741835/article/details/136202771?spm1001.2014.3001.5502 参考得到电子书&#xff1a;第八章。 https://www.dedao.cn/ebook/reader?idrEQKv6…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时&#xff0c;使用windows上内置搜索会很慢&#xff0c;这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索&#xff0c;"Everything&…

好用的伪原创工具有哪些?

伪原创工具哪个好用&#xff1f;在互联网时代&#xff0c;内容创作是一项至关重要的工作。然而&#xff0c;随着信息爆炸式增长&#xff0c;内容创作者们往往面临着时间和灵感的压力。为了解决这一难题&#xff0c;越来越多的人开始寻找伪原创工具&#xff0c;这些工具可以帮助…

32单片机基础:对射式红外传感器计次

接线如下图&#xff1a; 在HardWare建立两个文件&#xff1a;如图 COuntSensor.c 如何配置外部中断,根据下面图&#xff0c;我们需要把外部中断从GPIO到NVIC这一路出现的外设模块都配置好。把这条信号打通就OK了。 1.配置RCC:把我们这里涉及的外设时钟都打开&#xff0c;不打…

用什么软件制作电子杂志

想要制作高大上的电子杂志&#xff1f;别再烦恼啦&#xff01;今天给大家推荐一款超级实用的软件&#xff0c;让你轻松制作出专业水准的电子杂志&#xff01; 这款软件功能强大&#xff0c;操作简单&#xff0c;适合所有对设计感兴趣的小伙伴们。无论是新手还是专业设计师&…

20.scala视图界定

目录 概述实践代码执行 结束 概述 scala 中的视图界定 实践 代码 /*** 视图界定*/ object Genericity03 {def main(args: Array[String]): Unit {println(new MaxInt(1,2).compare)println(new MaxLong(1L,2L).compare)// 不行 // println(new MaxValue(1,2).compare)// …

[c++] 深拷贝和浅拷贝,拷贝构造、赋值运算符

1 拷贝构造和赋值运算符 1.1 拷贝构造 拷贝构造在如下场景会被调用&#xff1a; &#xff08;1&#xff09;函数调用时&#xff0c;函数参数是对象的值传递 &#xff08;2&#xff09;声明对象同时初始化的时候(而不是声明和初始化分开&#xff0c;因为声明的时候就创建了对…

游戏配置内存“瘦身”策略

背景 游戏配置数据绝对是游戏服务器进程的内存大头,有些游戏服务器单纯数据配置的容量就超过一个G。因此,这部分内存优化也就放在首要位置了。 优化策略 在《服务器进程如何降低内存》一文中,我们讲述了可以通过“优化游戏配置缓存”来降低游戏服务器进程的内存使用量。本…

【电子通识】认识FMEA(失效模式和影响分析)

FMEA是Failure Mode and Effect Analysis的英文缩写&#xff0c;中文名称为失效模式和影响分析。主要应用于航空航天、食品、汽车和核电等行业。 FMEA讨论的是事先策划以及执行措施&#xff0c;预防问题的发生或控制问题的发展&#xff0c;降低设计和过程的风险。由于问题还没…