使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证

这篇具有很好参考价值的文章主要介绍了使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官网介绍:kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等。

前一文章《开源对象存储系统MinIo部署配置与SpringBoot客户端整合访问》已经介绍MinIo部署和SpringBoot的基本整合。
本文介绍kkFileView的部署,并可以预览MiniIo存储的文档。
kkFileView没有权限认证功能,本文使用Spring Gateway为kkFileView增加登录才能预览文档的功能。

1、kkfileview下载部署

官网:https://kkview.cn
码云源码:https://gitee.com/kekingcn/file-online-preview

1.1、安装包部署运行

1.1.1、物理机或虚拟机上运行

自v4.1.0 版本开始 kkFileView 不再免费提供 Windows 和 Linux 的发行安装包了,可以自己基于源码编译打包运行。
本文测试用的4.0.0版本来自文章:https://blog.csdn.net/qq_37284798/article/details/129377354提供。
解压kkFileView-x.x.x文件(Windows用.zip包,Linux/MacOS用.tar.gz包)
打开解压后文件夹的bin目录,运行startup脚本(Windows下以管理员身份运行startup.bat,Linux以root用户运行startup.sh)
浏览器访问本机8012端口 http://127.0.0.1:8012 即可看到项目演示用首页

1.1.2、Docker容器环境环境运行

使用docker部署

# 拉取镜像 
# docker中央仓库https://hub.docker.com/r/keking/kkfileview,仓库最新版本只有4.1.0版本;Gitee源码最新版本为4.3.0
docker pull keking/kkfileview:4.1.0

# 运行
docker run -it -p 8012:8012 keking/kkfileview:4.1.0

浏览器访问容器8012端口 http://127.0.0.1:8012 即可看到项目演示用首页

使用docker-compose部署

# 配置文件docker-compose.yml
version: '3'
services:
  web:
    restart: always
    container_name: kkfileview
    image: keking/kkfileview:4.1.0
    ports:
      - "8012:8012"
    privileged: true
    volumes:
      - "./config/application.properties:/opt/kkFileView-4.1.0/config/application.properties"
      - "./log:/opt/kkFileView-4.1.0/log"
      
## 启动命令
docker-compose up -d
## 关闭
docker-compose down

kkfileview官方参考配置application.properties内容

#######################################不可动态配置,需要重启生效#######################################
server.port = ${KK_SERVER_PORT:8012}
#server.servlet.context-path= ${KK_CONTEXT_PATH:/}
server.servlet.context-path= /preview
server.servlet.encoding.charset = utf-8
#文件上传限制
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=500MB
## Freemarker 配置
spring.freemarker.template-loader-path = classpath:/web/
spring.freemarker.cache = false
spring.freemarker.charset = UTF-8
spring.freemarker.check-template-location = true
spring.freemarker.content-type = text/html
spring.freemarker.expose-request-attributes = true
spring.freemarker.expose-session-attributes = true
spring.freemarker.request-context-attribute = request
spring.freemarker.suffix = .ftl

# office-plugin
## office转换服务的进程数,默认开启两个进程
office.plugin.server.ports = 2001,2002
## office 转换服务 task 超时时间,默认五分钟
office.plugin.task.timeout = 5m

#预览生成资源路径(默认为打包根路径下的file目录下)
#file.dir = D:\\kkFileview\\
file.dir = ${KK_FILE_DIR:default}

#允许预览的本地文件夹 默认不允许任何本地文件被预览
#file.dir = D:\\kkFileview\\
local.preview.dir = ${KK_LOCAL_PREVIEW_DIR:default}


#openoffice home路径
#office.home = C:\\Program Files (x86)\\OpenOffice 4
office.home = ${KK_OFFICE_HOME:default}

#缓存实现类型,不配默认为内嵌RocksDB(type = default)实现,可配置为redis(type = redis)实现(需要配置spring.redisson.address等参数)和 JDK 内置对象实现(type = jdk),
cache.type =  ${KK_CACHE_TYPE:jdk}
#redis连接,只有当cache.type = redis时才有用
spring.redisson.address = ${KK_SPRING_REDISSON_ADDRESS:127.0.0.1:6379}
spring.redisson.password = ${KK_SPRING_REDISSON_PASSWORD:}
#缓存是否自动清理 true 为开启,注释掉或其他值都为关闭
cache.clean.enabled = ${KK_CACHE_CLEAN_ENABLED:true}
#缓存自动清理时间,cache.clean.enabled = true时才有用,cron表达式,基于Quartz cron
cache.clean.cron = ${KK_CACHE_CLEAN_CRON:0 0 3 * * ?}

#######################################可在运行时动态配置#######################################
#提供预览服务的地址,默认从请求url读,如果使用nginx等反向代理,需要手动设置
#base.url = https://file.keking.cn
#base.url = ${KK_BASE_URL:default}
base.url = http://127.0.0.1:8012/preview

#信任站点,多个用','隔开,设置了之后,会限制只能预览来自信任站点列表的文件,默认不限制
#trust.host = file.keking.cn,kkfileview.keking.cn
trust.host = ${KK_TRUST_HOST:default}

#是否启用缓存
cache.enabled = ${KK_CACHE_ENABLED:true}

#文本类型,默认如下,可自定义添加
simText = ${KK_SIMTEXT:txt,html,htm,asp,jsp,xml,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd}
#多媒体类型,默认如下,可自定义添加
media = ${KK_MEDIA:mp3,wav,mp4,flv}
#是否开启多媒体类型转视频格式转换,目前可转换视频格式有:avi,mov,wmv,3gp,rm
#请谨慎开启此功能,建议异步调用添加到处理队列,并且增加任务队列处理线程,防止视频转换占用完线程资源,转换比较耗费时间,并且控制了只能串行处理转换任务
media.convert.disable = ${KK_MEDIA_CONVERT_DISABLE:false}
#支持转换的视频类型
convertMedias = ${KK_CONVERTMEDIAS:avi,mov,wmv,mkv,3gp,rm}
#office类型文档(word ppt)样式,默认为图片(image),可配置为pdf(预览时也有按钮切换)
office.preview.type = ${KK_OFFICE_PREVIEW_TYPE:image}
#是否关闭office预览切换开关,默认为false,可配置为true关闭
office.preview.switch.disabled = ${KK_OFFICE_PREVIEW_SWITCH_DISABLED:false}

#是否禁止演示模式
pdf.presentationMode.disable = ${KK_PDF_PRESENTATION_MODE_DISABLE:true}
#是否禁止打开文件
pdf.openFile.disable = ${KK_PDF_OPEN_FILE_DISABLE:true}
#是否禁止打印转换生成的pdf文件
pdf.print.disable = ${KK_PDF_PRINT_DISABLE:true}
#是否禁止下载转换生成的pdf文件
pdf.download.disable = ${KK_PDF_DOWNLOAD_DISABLE:true}
#是否禁止bookmark
pdf.bookmark.disable = ${KK_PDF_BOOKMARK_DISABLE:true}
#是否禁用首页文件上传
file.upload.disable = ${KK_FILE_UPLOAD_ENABLED:false}

#预览源为FTP时 FTP用户名,可在ftp url后面加参数ftp.username=ftpuser指定,不指定默认用配置的
ftp.username = ${KK_FTP_USERNAME:ftpuser}
#预览源为FTP时 FTP密码,可在ftp url后面加参数ftp.password=123456指定,不指定默认用配置的
ftp.password = ${KK_FTP_PASSWORD:123456}
#预览源为FTP时, FTP连接默认ControlEncoding(根据FTP服务器操作系统选择,Linux一般为UTF-8,Windows一般为GBK),可在ftp url后面加参数ftp.control.encoding=UTF-8指定,不指定默认用配置的
ftp.control.encoding = ${KK_FTP_CONTROL_ENCODING:UTF-8}

#水印内容
#例:watermark.txt = ${WATERMARK_TXT:凯京科技内部文件,严禁外泄}
#如需取消水印,内容设置为空即可,例:watermark.txt = ${WATERMARK_TXT:}
watermark.txt = ${WATERMARK_TXT:}
#水印x轴间隔
watermark.x.space = ${WATERMARK_X_SPACE:10}
#水印y轴间隔
watermark.y.space = ${WATERMARK_Y_SPACE:10}
#水印字体
watermark.font = ${WATERMARK_FONT:微软雅黑}
#水印字体大小
watermark.fontsize = ${WATERMARK_FONTSIZE:18px}
#水印字体颜色
watermark.color = ${WATERMARK_COLOR:black}
#水印透明度,要求设置在大于等于0.005,小于1
watermark.alpha = ${WATERMARK_ALPHA:0.2}
#水印宽度
watermark.width = ${WATERMARK_WIDTH:180}
#水印高度
watermark.height = ${WATERMARK_HEIGHT:80}
#水印倾斜度数,要求设置在大于等于0,小于90
watermark.angle = ${WATERMARK_ANGLE:10}

#Tif类型图片浏览模式:tif(利用前端js插件浏览);jpg(转换为jpg后前端显示);pdf(转换为pdf后显示,便于打印)
tif.preview.type = ${KK_TIF_PREVIEW_TYPE:tif}

1.2、接入说明

参考自官方Demo接入说明:http://127.0.0.1:8012/index
如果你的项目需要接入文件预览项目,达到对docx、excel、ppt、jpg等文件的预览效果,那么通过在你的项目中加入下面的代码就可以成功实现:

var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址
window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(base64Encode(url)));

新增多图片同时预览功能,接口如下:

var fileUrl =url1+'|'+url2;//多url使用'|'字符隔开
window.open('http://127.0.0.1:8012/picturesPreview?urls='+encodeURIComponent(base64Encode(fileUrl)));

2、使用Spring Gateway增加登录认证

2.1、网关实现代码

Spring Gateway使用前文的例子:Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡。
增加一个全局过滤器类FileViewFilter.java,检查用户登录cookie是否存在。

package com.penngo.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;

@Component
public class FileViewFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        try{
            ServerHttpRequest request = exchange.getRequest();
            HttpHeaders headers = request.getHeaders();
            ServerHttpResponse response = exchange.getResponse();
            MultiValueMap<String, HttpCookie> cookieMap = request.getCookies();
            String currentUrl = request.getURI().getPath();
            if(currentUrl.startsWith("/preview")){
                boolean isForbid = true;
                if(cookieMap != null ){
                    List<HttpCookie> cookies = cookieMap.get("token");
                    if(cookies != null){
                        for(HttpCookie cookie:cookies){
                            if(cookie.getName().equals("token") && cookie.getValue().equals("test123456")){
                                isForbid = false;
                            }
                        }
                    }
                }
                if(isForbid == false){
                    return chain.filter(exchange);
                }
                else{
                    DataBuffer dataBuffer = response.bufferFactory().wrap("No permission, please login first!".getBytes());
                    response.setStatusCode(HttpStatus.OK);
                    return response.writeWith(Flux.just(dataBuffer));
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return -200;
    }
}

Nacos配置:

spring:
  cloud:
    gateway:
      routes:
        - id: previewid
          uri: http://192.168.245.139:8012/
          predicates:
            - Path=/preview/**
        - id: fileid
          uri: http://127.0.0.1:8080/
          predicates:
            - Path=/index/**
          filters:
            - StripPrefix=1

2.2、文件服务实现代码

文档预览服务基于开源对象存储系统minio部署配置与SpringBoot客户端整合访问上修改。
pom.xml增加依赖包:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

application.yml增加thymeleaf配置:

server:
  port: 8080
  servlet:
    encoding:
      force: true
      charset: UTF-8
      enabled: true
  tomcat:
    uri-encoding: UTF-8
  thymeleaf:
    mode: HTML
    cache: false
    encoding: UTF-8

FileController增加方法:

package com.penngo.example.controlleer;

import com.penngo.example.component.MinioUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.FileInputStream;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

@Controller
public class FileController {

    @Resource
    private MinioUtils minioUtils;


    @GetMapping("/fileListView")
    public String fileListView(HttpServletRequest request, Model model){
        Map<String, String> files =  minioUtils.getFileList();
        StringBuffer sff = new StringBuffer();
        Base64.Encoder encoder = Base64.getEncoder();
        Map<String, String> fileUrls =  new HashMap<>();
        files.forEach((k,v)->{
            String url = encoder.encodeToString(v.getBytes());
            url = "http://127.0.0.1:9090/preview/onlinePreview?url=" + URLEncoder.encode(url);
            fileUrls.put(k, url);
        });
        model.addAttribute("files",fileUrls);
        return "/index/fileList";
    }
    @RequestMapping("/login")
    public String login(HttpServletRequest request) {
        return "/index/login";
    }

    @RequestMapping( value ="/save", method = RequestMethod.POST)
    public String save(HttpServletRequest request, HttpServletResponse response, Model model, @RequestParam String user, @RequestParam String passwd){
        model.addAttribute("stat", "登录失败");
        if(user.equals("admin") && passwd.equals("123456")){
            model.addAttribute("stat", "登录成功");
            Cookie[] Cookies =  request.getCookies();
            Cookie cookie = new Cookie("token", "test123456");
            cookie.setPath("/");
            cookie.setMaxAge(60 * 60 * 24);
            response.addCookie(cookie);
        }
        return "/index/login";
    }

    @RequestMapping( value ="/logout", method = RequestMethod.GET)
    public String logout(HttpServletRequest request, HttpServletResponse response, Model model){
        Map<String, String> data = new HashMap<>();
        model.addAttribute("stat", "退出成功");
        Cookie cookie = new Cookie("token", "");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        return "/index/logout";
    }
}

resources\templates\index\login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<span th:text="${stat}"></span>
<form action="./save" method="post">
    用户名: <input type="text" name="user" value=""><br>
    密 码: <input type="text" name="passwd" value=""><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

模板文件
fileList.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table >
    <tr th:each="file,url:${files}">
        <td style="white-space:nowrap;" th:text="${file.key}"></td>
        <td ><a target="_blank" th:href="${file.value}"><span th:text="${file.value}"></span></a></td>
    </tr>
</table>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<span th:text="${stat}"></span>
<form action="./save" method="post">
    用户名: <input type="text" name="user" value=""><br>
    密 码: <input type="text" name="passwd" value=""><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

2.3、Demo运行效果

文件浏览列表,例子只放了一个office文档
访问文件列表
使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证,java,spring,gateway,java
未登录前访问文档,提示“没有权限,请先登录”
使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证,java,spring,gateway,java
登录
使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证,java,spring,gateway,java

使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证,java,spring,gateway,java
登录后再访问文档地址,已能成功预览docx文档
使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证,java,spring,gateway,java文章来源地址https://www.toymoban.com/news/detail-702028.html

到了这里,关于使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Minio 踩坑 Docker 使用 免费开源对象存储 MINIO 包会安装

    minio简介: 对象存储人工智能数据基础设施 MinIO 是一种高性能、S3 兼容的对象存储。它是为大规模 AI/ML、数据湖和数据库工作负载。它是软件定义的并在任何云或本地基础设施上运行。MinIO 具有双重许可根据开源 GNU AGPL v3 和商业企业许可证。 之前使用的是官方的minio/minio,

    2024年04月14日
    浏览(46)
  • 开源对象存储系统minio部署配置与SpringBoot客户端整合访问

    官方介绍: MinIO 提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的私有云储存服务。在 GNU AGPL v3 下是 100% 开源的。 部署简单,只有一个minio可执行文件。 高性能,在 32 个 NVMe 驱动器节点和 100Gbe 网络上发布的 GET/PUT 结果超过 325 GiB/秒和 165 GiB/秒。 Kubernetes原

    2024年02月09日
    浏览(46)
  • minio开源的对象存储服务器安装及使用

    MinIO是一个开源的对象存储服务器,设计用于实现高性能、可扩展的云存储。它兼容Amazon S3云存储服务的API,因此可以与现有的S3兼容应用程序进行集成。 MinIO可以部署在本地服务器、私有云环境或公共云上,如AWS、Azure、Google Cloud等。它通过将数据分散在多个独立节点上实现

    2024年02月08日
    浏览(47)
  • 使用 Sealos 一键部署高可用 MinIO,开启对象存储之旅

    大家好!今天这篇文章主要向大家介绍如何通过 Sealos 一键部署高可用 MinIO 集群。 对象是二进制数据,例如图像、音频文件、电子表格甚至二进制可执行代码。对象的大小可以从几 B 到几 TB 不等。像 MinIO 这样的对象存储平台提供了专用工具和功能,使用标准的 S3 兼容 API 存

    2024年02月08日
    浏览(58)
  • 【Kubernetes】k8s使用minio作为对象存储

    k8s version:v1.20.15 minio version :v4.4.16 (1)安装kubectl-minio插件 自选minio-operaterd的版本下载包 minio-operater plugin 访问地址:http://ip:9090 1、sc-minio.yaml 创建 2、 创建所需的永久卷 序号 路径 容量 (G) 说明 所在节点 1 /data/1 5 租户使用 3个节点各1个 2 /data/log1 5 租户使用 3个节点各1个

    2024年04月09日
    浏览(49)
  • 对象存储服务-MinIO基本集成

    MinIO 是一个 高性能的分布式对象存储服务 ,适合存储非结构化数据,如图片,音频,视频,日志等。对象文件最大可以达到5TB。 下载完毕后: 在当前minio目录下,会出现一个minio文件 然后在 /usr/local/minio/目录下,新建一个run.sh并编辑以下内容 vim run.sh,然后将以下内容保存

    2024年02月12日
    浏览(42)
  • 【Java笔记】对象存储服务MinIO

    1 MinIO简介 MinIO 基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用 Golang 实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。 MinIO兼容亚马逊S3云存

    2024年02月13日
    浏览(55)
  • Docker 搭建 Minio 对象存储服务

    MinIO 是一款基于 Go 语言发开的高性能、分布式的对象存储系统,客户端支持 Java,Net,Python,Javacript,Golang语言。 MinIO 的主要目标是作为私有云对象存储的标准方案,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据、容器和虚拟机镜像等,而一

    2024年02月06日
    浏览(47)
  • MinIO:开源对象存储解决方案

    MinIO是一款开源的云原生对象存储解决方案,旨在提供高性能、可扩展和持久化存储服务。它兼容Amazon S3 API,可以轻松地集成到现有的应用程序中,为用户提供可靠的对象存储和数据管理。本文将介绍MinIO的基本概念、架构设计以及常见的应用场景,帮助读者了解和使用这个

    2024年02月16日
    浏览(38)
  • 使用MinIO文件存储系统【完成视频断点续传】业务逻辑

    目录 视频上传 接口一:检查该视频/媒资文件是否已经上传完成 接口二:检查视频分块是否已经在minio中已经存在 接口三:上传分块文件到minio中(已经上传的分块会在接口二进行校验) 接口四:合并上传的分块文件保存文件合并后的文件信息 视频上传流程图 接口一:检查

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包