https页面加载http资源的解决方法

简介: https页面加载http资源的解决方法

image.png

@[toc]

1.报错如图

image.png

2.项目背景

我们的项目采用的全是https请求,而使用第三方文件管理器go-fastdfs,该文件管理器返回的所有下载文件的请求全是http开头的,比如http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx,然而在https请求下使用http的请求就会报如上图的错误,且不能把文件下载请求http改为https,因为修改后会查询不到文件。所以必须只能采用http的请求且想让功能实现。

image.png

注意点1:我们公司项目请求协议前缀必须是https的,执行http的无效

注意点2:这种第三方返回的文件下载路径http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx,是可以直接放在浏览器上直接下载的,具体请看如图
image.png

3.网上的解决方案

可以先看下其他人的博客,但是方案对我目前公司项目无效

1.https页面加载http资源的解决方法

2.分享 4个解决 https页面加载http资源报错的方法

问题:里面的方案为啥对我公司的项目无效?

答案:

  • 针对修改协议前缀的方案,我们的必须得是https的才行,其他无效。
  • 针对使用 iframe 的方案,因为没用过,且感觉项目引入会很费事且庞杂,所以当时没考虑该方案。
  • 针对自动升级方案(也就是说把第三方文件管理器go-fastdfs配置文件改了,由http协议改为https协议),该方案真对我的项目不行,因为我的公司有很多老项目都是用这个文件管理器go-fastdfs,如果把协议改了,不清楚对其他服务会不会有影响,所以轻易不能动。

综上所述:上面的方案我一个都不能用,所以我需要另想他法。

4.我的最终解决方案

接下来说下我最终想到的方便且容易上手的解决方案:那就是采用http工具执行url -> 然后把文件先下载到项目所在服务器的临时目录内 -> 然后再以读取普通文件路径的方式加载成File -> 再然后以流的方式输出给客户端弹窗另存为保存 -> 最后关闭流并删除服务器路径下的临时文件。

pom.xml

<dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
</dependency>
<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.4.1</version>
</dependency>
<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.17</version>
</dependency>
AI 代码解读

前端js代码

//批量管理-下载批量导入数据
function downloadBatchImportDataTaskActionColumn(taskId) {
   
    var language = 'zh';
    if(Cookies.get("language") != null &&  Cookies.get("language") != "")
    {
   
        language = Cookies.get("language") ;
    }
    var url = prefix + "/downloadBatchImportData?language=" + language;
    var form = $("<form></form>").attr("action", url).attr("method", "post");
    form.append($("<input></input>").attr("type", "hidden").attr("name", "taskId").attr("value", taskId));
    form.appendTo('body').submit().remove();
}
AI 代码解读

后端Controller代码

/**
     * 下载批量导入数据
     * 流程:
     *      查询数据库判断filedownLink字段是否为空
     *          为空:则代表旧数据,没有gofd对应的下载文件地址,因此把模板文件返回给客户端
     *          不为空:则代表gofd已经上传了对应的批量导入文件,且数据库中保存地址链接
     *              通过filedownLink封装成FiLE
     *                  判断File在临时目录内是否存在
     *                      存在:则直接返回给客户端,最后再把服务器临时目录内文件删除
     *                      不存在:则通过http工具调用filedownLink封装成File,将文件写入tempFilePath临时目录内,再把文件File返回给客户端,最后再把服务器临时目录内文件删除
     * @param req req
     * @param response response
     */
    @RequestMapping(value = "/downloadBatchImportData")
    public void downloadBatchImportData(HttpServletRequest req, HttpServletResponse response) {
   
        logger.info("-downloadBatchImportData-begin");
        String taskId = req.getParameter("taskId");
        OutputStream os = null;
        InputStream io = null;
        String tempFilePath = TEMP_FILE_PATH;
        String fileName = "";
        String language = req.getParameter("language");
        Workbook wb = null;

        try {
   
            ImpExpTaskDetail impExpTaskDetail = isvcBatchTaskServiceMicro.selectTaskDetailByTaskId(taskId);
            String filedownLink = impExpTaskDetail.getLink();
            if (org.springframework.util.StringUtils.isEmpty(filedownLink)) {
   
                fileName = MessageUtils.message("batch.template") + ".xlsx";
                String templateFileName = BatchConstant.DOWNAD_TEMPLATE_NAME + "_" + language + BatchConstant.EXTENSION_XLSX;
                SysUser sysUser = ShiroUtils.getSysUser();
                logger.info("-downloadBatchImportData-taskId:{},language:{}", taskId, language);
                if (isysUserService.get36kType(sysUser.getUserId()) == Poc36kEnum.POC6K.getType()) {
   
                    templateFileName = BatchConstant.DOWNAD_TEMPLATE_NAME + "6k" + "_" + language + BatchConstant.EXTENSION_XLSX;
                }
                File templateFile = org.springframework.util.ResourceUtils.getFile("classpath:" + templateFileName);
                logger.info("-Template file exist!,templateFileName:{}", templateFileName);
                io = new FileInputStream(templateFile);
                wb = new XSSFWorkbook(io);
            } else {
   
                fileName = StringUtils.subscribeNameString(filedownLink);
                File file = ResourceUtils.getFile(String.join(File.separator, tempFilePath, fileName));
                if (!file.exists()) {
   
                    String begin = DateUtil.now();
                    DateTime beginTime = DateUtil.parse(begin);
                    long download = HttpUtil.downloadFile(filedownLink, FileUtil.file(tempFilePath, fileName), new StreamProgress() {
   
                        @Override
                        public void start() {
   
                            logger.info("开始下载,时间为:" + begin);
                        }

                        @Override
                        public void progress(long progressSize) {
   
                            logger.info("已下载:{}", FileUtil.readableFileSize(progressSize));
                        }

                        @Override
                        public void finish() {
   
                            String end = DateUtil.now();
                            DateTime endTime = DateUtil.parse(end);
                            long between = DateUtil.between(beginTime, endTime, DateUnit.MS);
                            logger.info("下载完成,用时:" + DateUtil.formatBetween(between, BetweenFormatter.Level.SECOND));
                        }
                    });
                }

                io = new FileInputStream(file);
                wb = new XSSFWorkbook(io);
            }
            logger.info("-tempFilePath:{},fileName:{}", tempFilePath, fileName);
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
            wb.write(response.getOutputStream());
        } catch (IOException e) {
   
            logger.error("-downloadBatchImportData error:{}", e.getMessage());
        } finally {
   
            if (os != null) {
   
                try {
   
                    os.close();
                } catch (IOException e) {
   
                    logger.error("-OutputStream error:{}", e.getMessage());
                }
            }
            if (io != null) {
   
                try {
   
                    io.close();
                } catch (IOException e) {
   
                    logger.error("-InputStream error:{}", e.getMessage());
                }
            }
            if (Optional.ofNullable(tempFilePath).isPresent()) {
   
                // 强制删除临时文件
                boolean isDelete = com.hytalk.util.FileUtil.delFile(new File(tempFilePath));
                logger.info("-downloadBatchImportData 强制删除临时文件 , filePath: {} , isDelete : {} ", tempFilePath, isDelete);
            }
        }
    }
AI 代码解读

FileUtil工具类

import java.io.File;

/**
 * 文件工具
 * @Author 211145187
 * @Date 2023/4/19 14:27
 **/
public class FileUtil {
   

    /**
     * 删除文件
     * @param file 文件
     * @return boolean
     */
    public static boolean delFile(File file) {
   
        if (!file.exists()) {
   
            return false;
        }
        if (file.isDirectory()) {
   
            File[] files = file.listFiles();
            for (File f : files) {
   
                delFile(f);
            }
        }
        return file.delete();
    }
}
AI 代码解读

StringUtils工具类

/**
 * 字符串工具
 * @author 211145187
 * @Date: 2021/11/11 16:11
 **/
public class StringUtils {
   
    /**
     * 截取url地址中的名称,比如路径地址为“http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx”,最后截取的名称为“组 (26).xlsx”
     * @param str 原字符串
     * @return 截取后的字符串
     */
    public static String subscribeNameString(String str) {
   
        if (str.lastIndexOf("/") > -1) {
   
            str = str.substring(str.lastIndexOf("/") + 1);
        }
        return str;
    }
}
AI 代码解读

说明:

只在意我的思路流程即可,至于工具类或者查数据库数据代码啥的就不复制粘贴了。

image.png

重要信息

image.png
image.png
image.png

目录
打赏
0
5
5
0
225
分享
相关文章
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
815 68
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
网页显示HTTP错误503怎么办?HTTP错误503解决方法
HTTP 503错误表示服务器暂时无法处理请求,通常是由于服务器过载或维护导致。常见解决方法包括:1. 等待一段时间再刷新页面;2. 检查服务器负载;3. 确认服务器是否在维护;4. 检查配置错误;5. 联系服务提供商。通过这些步骤,用户和管理员可以有效排查并解决该问题。
26 3
Introduction to the HTTP and HTTPS Protocol
HTTP protocol is the foundation of the Internet, and HTTPS is the secure version of HTTP. HTTP is an application layer protocol based on TCP/IP protocol. It does not involve packet (packet) transmission, mainly specifying the communication format between the client and the server, and the default po
69 25
代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?
本文详细介绍了HTTP、HTTPS和SOCKS5三种代理协议的特点、优缺点以及适用场景。通过对比和分析,可以根据具体需求选择最合适的代理协议。希望本文能帮助您更好地理解和应用代理协议,提高网络应用的安全性和性能。
58 17
Envoy 开启 HTTP2 后偶现 404 解决方法
在大部分基于 Envoy 实现的网关里,都存在这样一个问题,当开启 http2 时,客户端访问会出现偶发的 404,并且可以从日志注意到这些 404 的请求,:authority 头里的域名和 SNI 里的域名不一致。且在使用泛域名证书,且配置了多个域名的路由的情况下,这个问题特别容易出现。
HTTPS与HTTP:区别及安全性对比
HTTP和HTTPS是现代网络通信中的两种重要协议。HTTP为明文传输,简单但不安全;HTTPS基于HTTP并通过SSL/TLS加密,确保数据安全性和完整性,防止劫持和篡改。HTTPS还提供身份验证,保护用户隐私并防止中间人攻击。尽管HTTPS有额外的性能开销和配置成本,但在涉及敏感信息的场景中,如在线支付和用户登录,其安全性优势至关重要。搜索引擎也更青睐HTTPS网站,有助于提升SEO排名。综上,HTTPS已成为大多数网站的必然选择,以保障用户数据安全和合规性。
115 1
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
991 8
HTTP和HTTPS的区别
本文介绍HTTP与HTTPS的区别、HTTPS链接建立过程及常见加密算法。HTTP为明文传输,易被窃听;HTTPS通过SSL/TLS协议加密,确保数据安全。HTTPS使用端口443,提供认证机制。文中还详细讲解了对称加密(如AES、DES)和非对称加密(如RSA、ECC)算法的特点及应用场景。
【DrissionPage】Linux上如何将https改为http
通过上述步骤,可以在Linux上将DrissionPage从HTTPS改为HTTP。关键在于修改DrissionPage配置、代码中的HTTPS设置、URL以及Web服务器配置,确保所有部分都正确使用HTTP协议。通过合理配置和测试,能够确保系统在HTTP环境下稳定运行。
103 1
第六问:http和https区别与联系
HTTP 和 HTTPS 是现代网络通信中的两种重要协议。HTTP 是明文传输协议,无加密功能;HTTPS 在 HTTP 基础上加入 SSL/TLS 加密层,提供数据加密、身份验证和数据完整性保障。HTTP 适用于非敏感信息传输,如新闻网站;HTTPS 适用于在线支付、账户登录等需要保护用户数据的场景。
85 0

物联网

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等