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

这篇具有很好参考价值的文章主要介绍了https页面加载http资源的解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https网站加载http图片,Spring及SpringBoot相关,JAVA相关,http,https,https页面加载http资源,https加载http,java

1.报错如图

https网站加载http图片,Spring及SpringBoot相关,JAVA相关,http,https,https页面加载http资源,https加载http,java

2.项目背景

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

https网站加载http图片,Spring及SpringBoot相关,JAVA相关,http,https,https页面加载http资源,https加载http,java
注意点1:我们公司项目请求协议前缀必须是https的,执行http的无效

注意点2:这种第三方返回的文件下载路径http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx,是可以直接放在浏览器上直接下载的,具体请看如图
https网站加载http图片,Spring及SpringBoot相关,JAVA相关,http,https,https页面加载http资源,https加载http,java

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>       

前端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();
}

后端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);
            }
        }
    }

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();
    }
}

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;
    }
}

说明:

只在意我的思路流程即可,至于工具类或者查数据库数据代码啥的就不复制粘贴了。文章来源地址https://www.toymoban.com/news/detail-549196.html

到了这里,关于https页面加载http资源的解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 解决Electron中WebView加载部分HTTPS页面白屏的方法

    Electron是一个开源的桌面应用程序框架,它允许使用Web技术构建跨平台的桌面应用。在Electron应用中, WebView 是一个常用的组件,用于嵌套加载Web内容。然而,有时候在加载使用 HTTPS 协议的页面时,可能会因为证书问题导致白屏现象。 问题描述: 当 WebView 尝试加载某些 HTTP

    2024年02月02日
    浏览(53)
  • 在https网站中加载http资源

    https中加载http资源,如果该资源https也有,直接替换就是,如果没有,如果按照网上的做法大概率是不奏效。言归正传,在一位C友文章中看到了利用nginx来做代理来实现访问http资源之后,我自己也做了尝试。 参考链接​​​​​​https://blog.csdn.net/weixin_48030265/article/details/13

    2024年03月19日
    浏览(83)
  • https页面中引入http资源的方式

    ​ https引入http要根据具体情况分析,但是解决问题的前提是要先了解二者概念和区别,以及找问题出在哪里。不同项目有不同配置,不一定每次遇到同样的问题,都能用同样的办法解决,但是可以从以往遇到的情况和解决问题的方法进行分析,下面是我遇到https 页面中引入

    2024年02月12日
    浏览(37)
  • 网站开发中如何优化图片资源的加载速度

    在网站开发中,优化图片资源的加载速度对于提高用户体验和网站性能至关重要。通过采取一系列的优化措施,可以减少图片的文件大小,改善加载速度,并确保图片在不影响质量的情况下显示良好。 使用适当的图片格式:选择适合的图片格式可以有效减少文件大小。JPEG适

    2024年02月05日
    浏览(52)
  • Nginx配置https网站访问第三方节点的http资源

    https网站无法直接下载http网站的文件。解决思路有以下几种情况:1.两个网站都同时改为http或https。2.通过nginx转发。3.通过后端java代码获取对方网站的文件流然后把流返回给前端 本文介绍如果通过nginx转发访问http网站 配置规则一: 这样配置之后,本地网站比如是:访问htt

    2024年02月16日
    浏览(53)
  • 网站HTTP升级成为HTTPS的方法

    将网站从HTTP免费升级为HTTPS,您可以按照以下步骤操作: 1. 选择证书颁发机构(CA):    - 为了免费升级,您可以选择使用 JoySSL 这样的公益项目。 JoySSL 提供免费、自动化的SSL/TLS证书颁发服务,适用于各种规模的网站。 永久免费SSL证书_永久免费https证书_永久免费ssl证书申

    2024年04月11日
    浏览(41)
  • 解决网站加载图片太慢

    由于网站加载高清无损的照片的是十分耗时的,如果动不动就是几M,甚至10几M的图片,那加载起来可就难受了,所以我们第一个应该想到的是压缩图片来解决图片的大小,推荐两个很好用的压缩图片的网站。链接如下, https://tinypng.com/:有图片大小限制和每一次上传数量限制为

    2024年02月04日
    浏览(38)
  • Unity队列加载图片,解决大量同时加载资源卡顿问题与思路

    1、思路:加载图片的请求都加到队列中,然后一个加载完一个再去加载下一个,直到加载完。 2、问题:         问题是相对也存在的。当加载的数据还在队列中,但是已经跳转到其它的场景,则会出现报错的问题。         每次跳转场景的时候,需要把队列中的数据情况

    2024年02月16日
    浏览(52)
  • Vue3 - vite 引入本地图片方法,页面引入本地静态资源图像详细教程,解决 UI 前端组件库的图片属性无法使用本地图像问题(无论是本地开发还是打包部署,本地图片的路径正常可用)

    在 webpack 中通常用 require() 来引入静态图片,但在 vite 中这种方法就不行了。 本文实现了 在 vue3+vite 项目开发中,实现引入本地图片(静态资源),并且 build 打包后依然正常运行, 支持普通 img 标签使用,也支持 UI 组件库的各种 “图片属性” 当参数进行使用。 如下图所示

    2024年02月08日
    浏览(76)
  • Vue页面 - 大型图片加载慢解决途径

    解决图片加载慢的两种优化方式 两个内外尺寸一致的盒子,外层放置压缩图,内层放置高清图,高清图加载完成后铺盖压缩图即可 在不同阶段使用不同图片资源

    2024年02月16日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包