前后端分离下解决文件下载权限问题

在前后端分离的框架中,由于Ajax请求文件下载的限制,无法通过Header传递用户信息进行权限校验。本文提出了一种解决方案:用户在下载前先进行权限检查,若权限足够则生成一次性下载链接,确保数据安全性。流程包括业务模块前端验证权限、生成唯一下载链接及文件服务处理。核心代码包括下载控制器、文件服务类和接口。
摘要由CSDN通过智能技术生成

问题

背景介绍

前后端分离框架中,前端在发起Ajax请求时,在Header携带Token值,后端获取该Token进行权限校验。

问题描述

在下载文件的场景,大部分浏览器是不支持Ajax请求文件下载,所以通常做法是直接请求下载地址,这时候是无法通过代码设置Header的参数,也就是无法知道当前用户信息,如何进行权限控制?

解决方案

该问题的痛点是数据权限问题。

初步思路

  1. 在用户要下载的时候,先进行权限校验
  2. 权限不足时,进行信息提示
  3. 权限足够时,则为用户生成一次性的下载链接(下载一次后失效,保证数据安全)

设计思路

  1. 流程设计
  2. 抽象功能
  3. 具体实现

流程设计

业务模块前端:业务模块的前端代码,例如用户信息下载的前端代码。
业务服务后端:业务模块的后端代码(非介绍重点,所以不做细节区分)。
文件服务类:文件服务的业务类,主要是处理业务逻辑,例如:生成下载地址的唯一编号,以及唯一编号映射的参数信息,文件生成。
文件控制类:提供统一的下载地址格式,放开权限。
在这里插入图片描述

代码设计

基于框架考虑,以下功能抽象出来:

  1. 持久化数据功能抽象(不同项目的具体情况不同)
  2. 生成文件功能抽象(因为不同业务生成文件的步骤是不一样的)
代码依赖关系

在这里插入图片描述

核心代码

DownloadController - 文件下载控制器,不做权限控制

package com.accloud.core.file.download.controller;

import com.accloud.core.file.download.FileResult;
import com.accloud.core.file.download.service.DownloadService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

/**
 * 文件下载控制器
 *
 * @author guoyu.huang
 * @since 2020-10-16
 */
@Slf4j
@Controller
@RequestMapping("/download")
public class DownloadController {
   

    @Autowired
    private DownloadService downloadService;

    &
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑾析编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值