idoc安装略过,参考官方文档。。。
项目背景是除了使用idoc对预览功能,某些场景下还需要对预览对工具栏上根据逻辑对下载或者打印等按钮进行隐藏或显示,但是我方购买的高级版的预览功能不带这个功能,需要去按照官方提供的文档说明进行扩展开发。
文档中"安全"部分说的还算详细,但是没有代码级别的demo,以下是在官方文档里摘要出来的。
为提高预览的安全性,预览服务提供灵活授权方式预览,可以控制当前用户对当前文档是否有上传、预览、试读、下载和文本拷贝等权限。
带权限验证的预览流程如下:
1. 用户发起预览
2. 权限验证
3. 返回用户预览
下面对这3个步骤分别说明:
1. 用户发起预览
一般预览链接为:
http://HOST/view/url?url=***
您可以根据自己需要,在预览链接后添加额外的自定义参数,以备下一步权限验证使用,例如:
http://HOST/view/url?url=***&authkey=***
2. 权限验证
默认预览不进行权限验证,直接返回预览页面。
如果需要权限验证,请先开启权限验证开关:
双击打开(左键双击,不是右键编辑)配置文件D:\idocv\setting.bat,找到参数:
thd.view.check.switch=false
修改为:
thd.view.check.switch=true
开启权限验证后,默认情况下,权限验证接口(thd.view.check.url)为空,则所有的权限都以默认权限列表参数(thd.view.check.default)为准。
配置示例1:
如果您要控制所有用户预览所有文件都不能下载,文字不能拷贝,则配置如下:
# 开启验证开关
thd.view.check.switch=true
# 验证接口保持默认值空
thd.view.check.url=
# 默认权限列表
thd.view.check.default={"down":"0","copy":"0"}
配置示例2:
如果您要控制所有用户预览所有文件都试读3页、禁止下载、禁止复制、禁止右键、禁止打印、添加水印,则配置如下:
thd.view.check.switch=true
thd.view.check.default={"view":"3","down":"0","copy":"0","menu":"0","print":"0","watermark":"idocv"}
如果不同用户对不同文件的权限都不相同,则需要您开发一个HTTP权限验证接口,配置到权限验证接口(thd.view.check.url)参数上,这样,用户每次预览时,预览服务都会调用您的验证接口,预览服务会把所有能获取到的参数(包括预览地址后面的所有参数,以及能获取到的Cookie信息)都传给您的权限验证接口,您的接口在接收到这些参数后,判断当前用户对当前文档是否有上传、下载、预览、复制、试读(只读前几页)等权限(权限参数详情参考配置文件参数thd.view.check.default说明),返回相应的JSON格式的权限字符串即可,JSON权限字符串格式可以参考参数thd.view.check.default的参数值,例如:{"down":"0","copy":"0"}
配置示例3:
# 开启验证开关
thd.view.check.switch=true
# 验证接口地址示例
thd.view.check.url=http://data.idocv.com/check.json
返回的参数可以是您需要控制的一部分参数,没有返回的参数则以thd.view.check.default配置为准。
3. 返回用户预览
根据相应的权限,返回给用户。例如本例中权限返回值{"down":"0","copy":"0"},则用户无法下载,也无法复制预览页面文本。
另外,预览服务还提供另2种验证方式(不推荐)以供参考:
1. 修改预览服务默认token,每次调用上传等接口时必须传入token参数,可不定期修改token;
2. 对于保密文档,可以设置为私有,通过sessionId预览文档,默认session有效期一小时(可配置),过期后预览链接失效。
开发示例
demo其实简单,就是在自己的项目里单独写一个check接口,返回的json按示例给的结构规范来,不过想吐槽的是为什么idoc官方不给出来demo,给试用开发者提供便利。
import lombok.Data;
/**
* description
*/
@Data
public class CheckViewVo {
/**
* 0. 不允许上传;1. 允许上传
*/
private String upload= "1";
/**
* 0. 不允许预览;1. 允许预览当前文档全部页面;>1. 只允许预览指定页数
*/
private String view = "1";
/**
* 0. 不允许下载, 1. 允许下载
*/
private String down = "1";
/**
* 0. 不允许文本拷贝, 1. 允许文本拷贝
*/
private String copy = "1";
/**
*0. 不允许右键菜单, 1. 允许右键菜单
*/
private String menu = "1";
/**
*0. 不允许打印, 1. 允许打印
*/
private String print = "1";
/**
*水印文本,默认给空字符串,不赋值就是www.idoc.com
*/
private String watermark = "";
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 文件预览校验
*/
@RestController
@RequestMapping("/web/idoc/view")
public class FileViewController {
private static final Logger log = LoggerFactory.getLogger(FileViewController.class);
/**
* 验证idoc文件的预览属性
* @param fileType
* @return CheckViewVo
*/
@GetMapping("check")
public CheckViewVo checkView(int fileType) {
log.info("checkView: request fileType="+ fileType);
CheckViewVo checkViewVo = new CheckViewVo();
// 可以根据自己自己场景逻辑来进行按钮配置的控制,并返回
if (FileTypeEnum.MAIN.getCode() == fileType){
// 这里将下载和打印按钮设置成隐藏了
checkViewVo.setDown(IdocCommonEnum.NO.getCode());
checkViewVo.setPrint(IdocCommonEnum.NO.getCode());
}
return checkViewVo;
}
}
部署的项目服务要和idoc的服务在一个网络环境里,能正常通信;以上示例的接口比如说在某个文档管理fileMange的服务中,接口的URL为https://file.xxxx.com.cn/web/idoc/view/check;
修改idoc的配置文件,文件目录在/idocv/docview/WEB-INFO/class/conf.properties
thd.view.check.switch=true
thd.view.check.uri=/view/
thd.view.check.url=https://file.xxxx.com.cn/web/idoc/view/check
修改并保存配置后重启服务就OK了。
至此简单的集成就完成,但是idoc这个商业化的产品,很多高级的功能都需要去“充值”,有点蛋疼。