Java安全后端返回文件流方式

 更新时间:2023年07月28日 14:44:19   作者:Aimyone  
这篇文章主要介绍了Java安全后端返回文件流方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java安全后端返回文件流

起由

业务流程:上传文件——服务器保存文件——根据路径访问文件

这种根据路径定位文件,并对文件进行查看的方式对文件安全有很大威胁,一旦知道其他文件的路径,很有可能会造成文件泄露

改进

所以,当前端访问文件的时候,发出请求并携带token,后端验证token,确认为合法用户之后,放行

根据请求路径执行后端的代码(后端代码逻辑:根据路径读取文件,输出文件流,响应给前端)

配置文件

配置上存文件的保存路径

代码

import org.apache.commons.io.IOUtils;
    @Value("${file.ectdreport-folder}")
    private String ectdReportFolder;
    @Transactional(rollbackFor = Exception.class)
    public void lookReport(String id, HttpServletResponse response) throws Exception {
        String url = ectdReportFolder + id + "/file1.html";
        File file = new File(url);
        if (!file.exists()) {
            throw new Exception("文件不存在");//抛出文件不存在的
        }
        response.setContentType("text/html");
        FileInputStream fis = null;
        OutputStream outputStream = response.getOutputStream();
        try {
            fis = new FileInputStream(file);
            //将读取流拷贝到输出流中
            IOUtils.copy(fis, outputStream);
            //清空缓存的读取流,保证数据完整性
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
           throw new Exception("解析失败");
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                outputStream.close();//输出流关闭
            }
        }
    }

后端返回文件流,前端怎么导出、下载

工作中肯定有很多导出excel、下载文件这种功能。一般都是后端做好,我们去请求对应的接口就行了,前端还需要做一些处理就可以实现导出、下载功能了。

第一步:在请求的时候做些一些处理

我们在请求的时候 需要定义responseType【响应类型】为blob类型,如果是post请求还需要在请求头里携带Content-Type: 'multipart/form-data'

  // 在请求的时候做一些处理
  // get请求
  markMownLoad = (id) => axios('get',`URLxxxxxx?fileId=${id}`,{
    responseType: 'blob',
    headers:{
      'Content-Type': 'multipart/form-data'
    }
  })
  // post请求
  markMownLoads = (id) => axios('post',`URLxxxxxx?fileId=${id}`,{
    responseType: 'blob',
    headers:{
      'Content-Type': 'multipart/form-data'
    }
  })

第二步:向后端发请求

在请求之前,我们先封装一个解码下载的一个方法,方便我们请求成功后调用

  function downLoadXls (res) {
    const fileNames = res.headers['content-disposition']
    if(fileNames) {
      //解码
      const fileName = decodeURIComponent(fileNames.match(/=(.*)$/)[1])
      // 处理返回的文件流
      const content =res.data
      const blob = new Blob([content],{
        type: "application/octet-stream; charset=utf-8"
      });
      if('download' in document.createElement('a')) {
        //非IE下载
        const a = document.createElement('a') //创建一个a标签
        a.download = fileName //指定文件名称
        a.style.display = 'none' //页面隐藏
        a.href = URL.createObjectURL(blob) // href用于下载地址
        document.body.appendChild(a) //插到页面上
        a.click() //通过点击触发
        URL.revokeObjectURL(a.href) //释放URL 对象
        document.body.removeChild(a) //删掉a标签
      }else{
        //IE10 + 下载
        navigator.msSaveBlob(blob,fileName)
      }
    }
  }

这个时候发请求就可以了

 // 发请求          把后端返回的传过去解码,然后实现导出、下载
  markMownLoads(参数).then(res => downLoadXls(res))

咱们来看一下后端返回的数据时什么样子的

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • jmeter接口测试之使用rsa算法加密解密的代码

    jmeter接口测试之使用rsa算法加密解密的代码

    这篇文章主要介绍了jmeter接口测试-使用rsa加密解密算法,部分接口采用了rsa加密算法,我们的jmeter 也是可以直接拿来调用的,不需要开发配合去掉加密代码,需要的朋友可以参考下
    2022-03-03
  • 通过Java连接SQL Server数据库的超详细操作流程

    通过Java连接SQL Server数据库的超详细操作流程

    java相对于其他语言(例如c,c++等)连接数据库要方便得多,那么如何连接呢?下面这篇文章主要给大家介绍了关于通过Java连接SQL Server数据库的超详细操作流程,需要的朋友可以参考下
    2023-03-03
  • Java数组,去掉重复值、增加、删除数组元素的实现方法

    Java数组,去掉重复值、增加、删除数组元素的实现方法

    下面小编就为大家带来一篇Java数组,去掉重复值、增加、删除数组元素的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Java利用读写的方式实现音频播放代码实例

    Java利用读写的方式实现音频播放代码实例

    这篇文章主要介绍了Java利用读写的方式实现音频播放代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java的线程池ThreadPoolExecutor及多种线程池实现详解

    Java的线程池ThreadPoolExecutor及多种线程池实现详解

    这篇文章主要介绍了Java的线程池ThreadPoolExecutor及多种线程池实现详解,ThreadPoolExecutor 使用 int 的高 3 位来表示线程池状态,低 29 位表示线程数量,之所以将信息存储在一个变量中,是为了保证原子性,需要的朋友可以参考下
    2024-01-01
  • 你一定不知道的Java Unsafe用法详解

    你一定不知道的Java Unsafe用法详解

    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,下面这篇文章主要给大家介绍了关于Java Unsafe用法的相关资料,需要的朋友可以参考下
    2021-10-10
  • 如何实现java8 list按照元素的某个字段去重

    如何实现java8 list按照元素的某个字段去重

    这篇文章主要介绍了如何实现java8 list按照元素的某个字段去重,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • Java 新特性之Option示例详解

    Java 新特性之Option示例详解

    使用Optional开发时要注意正确使用Optional的“姿势”,特别注意不要使用3.2节提到的错误示范,谨慎使用isPresent()和get()方法,尽量多使用map()、filter()、orElse()等方法来发挥Optional的作用,对Java  Option相关知识感兴趣的朋友一起看看吧
    2024-02-02
  • Spring中@Service注解的作用与@Controller和@RestController之间区别

    Spring中@Service注解的作用与@Controller和@RestController之间区别

    这篇文章主要介绍了Spring中@Service注解的作用与@Controller和@RestController之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Java中的守护线程问题

    Java中的守护线程问题

    这篇文章主要介绍了Java中的守护线程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论