kkFileView4.0.0向下兼容修改实现统一对外服务

简介: kkFileView 的一个使用场景优化

前言

公司存在多个项目需要使用 kk 的预览服务,但是使用的版本并不一致。部分项目因为上线时间较早,所以使用的是旧版的 kk,比如 2.x。kk 本身也在迭代,所以造成了旧项目在接入新版 kk 服务的时候产生了不兼容的现象。

问题原因

部分项目使用的 2.x 版本 kk 是使用的未 base64 编码的 url,而新版 4.0.0 的则是需要传入编码过的 url 才可以支持预览。新版的 kk 在很早前因为需要彻底解决各种奇葩文件名预览问题,所以 url 采用了 base64+urlencode 双编码。
旧项目当中在接入预览服务时需要传入明文地址,这样就导致预览服务无法使用了。

解决方案

可选的处理办法有两种。

额外传参

一个是增加一个参数告诉预览服务是使用的明文地址,预览服务需要根据额外的参数做兼容处理,初始版本是使用的这种办法,保证服务可用。

这种方法的缺点就是预览服务和使用方需要同时修改代码,但是使用方的修改量较小。

不额外传参

利用 url 本身的内容是否是经过 base64 编码的来区分处理。

好处就是不需要接入方做任何额外的改动,用户感觉不到变化。

修改方法

修改的关键就是判断字符串是否是经过 base64 加密的:将字符串解密后再将解密字符串加密回去与原来的值做比较,如果相同就是 base64。网上存在较多文章但是并不适用,所以这里结合 kk 的实际情况需要修改判断方法。

  1. 修改工具类文件 server/src/main/java/cn/keking/utils/WebUtils.java ,在后面追加判断 url 是否 base64 编码的方法。

/**
 * url是否base64编码
 *
 * @param str str
 * @return boolean
 */
public static boolean isBase64(String str) {
    // 将字符串解密后再将解密字符串加密回去与原来的值做比较 如果相同就是base64
    try {
        String decodeStr = new String(Base64Utils.decodeFromString(str), StandardCharsets.UTF_8);
        return str.equals(Base64Utils.encodeToString(decodeStr.getBytes(StandardCharsets.UTF_8)));
    } catch (Exception e) {
        return false;
    }
}
  1. 修改过滤器 server/src/main/java/cn/keking/web/filter/TrustHostFilter.java,追加对 url 参数的判断。

doFilter 方法中处理:


if (WebUtils.isBase64(url)) {
    url = new String(Base64Utils.decodeFromString(url), StandardCharsets.UTF_8);
}
  1. 修改主程序 server/src/main/java/cn/keking/web/controller/OnlinePreviewController.java ,在
    onlinePreview 方法中追加判断。

if (WebUtils.isBase64(url)){
    fileUrl = new String(Base64.decodeBase64(url), StandardCharsets.UTF_8);
} else {
    fileUrl = url;
}

然后重新编译项目就可以使用了。

总结

本次修改是为了向下兼容非 base64 编码的文件地址,所以是服务降级,有可能出现奇葩文件名预览问题。因为需要统一服务的原因所以才会产生这个临时修改方案,总体还是建议在合适时间适配到新版的 kk 服务,保证用户体验。

参考资料

相关文章
|
域名解析 Kubernetes Java
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
4638 1
图文详述Nacos配置中心使用:应用间配置共享、扩展配置文件加载优先级、新老版本差异
|
SQL 运维 监控
实战:私有化部署ngin+文件步骤记录
出差到某国企进行私有化部署,一波三折。没想到是那种最麻烦的部署,导入文件需要刻光盘,进入电脑房需要上交手机,不允许有人以及拍摄设备,内部有监控摄像头。 有问题怎么办?知道的自己先试试,一定也不懂的。手抄笔记本上,然后一个字一个字的敲出来。哦,对了,门口还没网,必须得往外走走。 以前只是听说过,现在是体会到了。在这里记录下,也给没去过的老铁们给个参考。
|
SQL JSON Java
Java开发业务接口规范
规范点 说明 推荐方式 等级 文档唯一性 文档出处来源(人员和设备)必须统一,建议文档服务器,统一发布人。   重要 接口环境 要明确给出各个环境的调用地址。
4989 0
|
C# 容器
旧项目集成
旧项目集成
138 0
旧项目集成
|
XML JSON 前端开发
开源的YAPI外还有哪些免费的接口工具?
API 管理这个话题近些年听到的频次越来越多,这本质上是个 web 领域的发展有关,也和开发协作方式有关--前后端分离代替了全栈工程师 hold all 的局面,强调的更多的是 API 复用、分工和协作细化。 API 管理的重要性不言而喻,每家公司随着业务的发展,多多少少都会涉及到;从开源社区的产品到国内各类商业化产品,可以看到大家对于 API 管理是越来越重视的。
|
SQL Oracle 关系型数据库
接口大师v3.13更新:支持一键导入swagger,即刻开放内部API接口
接口大师v3.13更新:支持一键导入swagger,即刻开放内部API接口
|
负载均衡 中间件 BI
AgileEAS.NET SOA 中间件平台 5.2 发布说明-包含Silverlight及报表系统的开源代码下载
一、AgileEAS.NET SOA 中间件简介      AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。
1200 3