当前位置: 首页 > wzjs >正文

建设网站是什么关系廊坊关键词排名首页

建设网站是什么关系,廊坊关键词排名首页,2022年注册公司流程,建设通网站查安全文件下载系统设计与实现 系统概述 本文介绍了一种基于Spring Boot的安全文件下载系统,该系统通过动态生成的令牌来保护文件下载,避免了静态URL带来的安全隐患。系统主要特点包括: 动态令牌机制:每个下载链接都有时效性 安全…

安全文件下载系统设计与实现

  1. 系统概述
    本文介绍了一种基于Spring Boot的安全文件下载系统,该系统通过动态生成的令牌来保护文件下载,避免了静态URL带来的安全隐患。系统主要特点包括:

动态令牌机制:每个下载链接都有时效性

安全验证:检查令牌有效性、用户权限和文件路径

灵活存储:支持内存存储和外部存储(如Redis)

多种文件来源:支持本地文件、内存文件和流式文件

  1. 核心组件设计
    2.1 DownloadToken类
public class DownloadToken {private final String token;private final String fileName;private final Instant expiresAt;private final String username;public DownloadToken(String fileName, Duration validFor, String username) {this.token = UUID.randomUUID().toString();this.fileName = fileName;this.expiresAt = Instant.now().plus(validFor);this.username = username;}public boolean isExpired() {return Instant.now().isAfter(expiresAt);}// Getterspublic String getToken() { return token; }public String getFileName() { return fileName; }public Instant getExpiresAt() { return expiresAt; }public String getUsername() { return username; }
}

2.2 TokenStore接口及实现

public interface TokenStore {void store(String token, DownloadToken downloadToken);DownloadToken getToken(String token);void removeToken(String token);
}// 内存实现
public class MemoryTokenStore implements TokenStore {private final static Map<String, DownloadToken> tokens = new ConcurrentHashMap<>();@Overridepublic void store(String token, DownloadToken downloadToken) {tokens.putIfAbsent(token, downloadToken);}@Overridepublic DownloadToken getToken(String token) {return tokens.get(token);}@Overridepublic void removeToken(String token) {tokens.remove(token);}
}
  1. 控制器实现
    3.1 生成下载链接
@RestController
@RequestMapping("/download")
public class DownloadController {private final TokenStore tokenStore;public DownloadController(TokenStore tokenStore) {this.tokenStore = tokenStore;}@GetMapping("/request-download")public ResponseEntity<String> createDownloadLink(@RequestParam String fileName) {// 验证文件路径安全Path baseDir = Paths.get("d:/images").toAbsolutePath().normalize();Path requestedPath = baseDir.resolve(fileName).normalize();if (!requestedPath.startsWith(baseDir)) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}DownloadToken token = new DownloadToken(fileName, Duration.ofMinutes(5), "pack");tokenStore.store(token.getToken(), token);String link = "/download/" + token.getToken();return ResponseEntity.ok(link);}
}

3.2 处理文件下载

@GetMapping("/{token}")
public ResponseEntity<Resource> download(@PathVariable String token) {DownloadToken stored = tokenStore.getToken(token);// 验证令牌if (stored == null || stored.isExpired()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}// 验证文件路径Path baseDir = Paths.get("d:/images").toAbsolutePath().normalize();Path filePath = baseDir.resolve(stored.getFileName()).normalize();if (!filePath.startsWith(baseDir)) {return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();}Resource file = new FileSystemResource(filePath);if (!file.exists()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}// 一次性令牌可在此处移除// tokenStore.removeToken(token);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").contentType(MediaType.APPLICATION_OCTET_STREAM).body(file);
}
  1. 高级功能实现
    4.1 内存文件下载
@GetMapping("/download-mem/{token}")
public ResponseEntity<byte[]> downloadFromMemory(@PathVariable String token) {DownloadToken downloadToken = tokenStore.getToken(token);if (downloadToken == null || downloadToken.isExpired()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}byte[] content = createFileStream(downloadToken.getFileName());return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + downloadToken.getFileName() + "\"").contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(content.length).body(content);
}

4.2 流式文件下载

@GetMapping("/download-stream/{token}")
public ResponseEntity<Resource> streamDownload(@PathVariable String token) throws IOException {DownloadToken downloadToken = tokenStore.getToken(token);if (downloadToken == null || downloadToken.isExpired()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}InputStream stream = fetchFromCloudStorage(downloadToken.getFileName());Resource resource = new InputStreamResource(stream);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + downloadToken.getFileName() + "\"").contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource);
}

4.3 安全认证下载

@GetMapping("/download-secure/{token}")
public ResponseEntity<Resource> downloadWithUserCheck(@PathVariable String token,@AuthenticationPrincipal UserDetails currentUser) {DownloadToken downloadToken = tokenStore.get(token);if (downloadToken == null || downloadToken.isExpired()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}if (!downloadToken.getUsername().equals(currentUser.getUsername())) {return ResponseEntity.status(HttpStatus.FORBIDDEN).build();}Path filePath = Paths.get("files", downloadToken.getFileName()).normalize();Resource file = new FileSystemResource(filePath);if (!file.exists()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"").body(file);
}
  1. 安全注意事项
    路径遍历防护:始终验证最终文件路径是否在允许的目录内
Path baseDir = Paths.get("d:/images").toAbsolutePath().normalize();
Path requestedPath = baseDir.resolve(fileName).normalize();
if (!requestedPath.startsWith(baseDir)) {// 拒绝请求
}
令牌有效期:为每个令牌设置合理的有效期
new DownloadToken(fileName, Duration.ofMinutes(5), "pack");

用户绑定:将下载令牌与特定用户绑定,防止令牌共享
一次性令牌:对于高敏感文件,可使用后立即删除令牌
6. 扩展建议
存储优化:对于生产环境,建议使用Redis等外部存储代替内存存储
下载统计:记录下载次数、用户等信息用于审计
速率限制:防止用户频繁生成下载链接
内容加密:对于高敏感文件,可考虑在传输前加密

http://www.dtcms.com/wzjs/516816.html

相关文章:

  • 自己电脑上做网站别人访问semir
  • 国外网站icp备案短视频seo软件
  • 执法局网站建设目的seo推广宣传
  • 科普新疆app下载aso优化违法吗
  • 浙江直播网站建设昆明网络推广优化
  • 广州网站到首页排名百度渠道开户哪里找
  • 推广方式和渠道在线seo工具
  • 手机视频网站设计短视频推广平台有哪些
  • 西安企业网站建设个人开发app可以上架吗
  • 政府网站建设年终总结高端定制网站建设公司
  • 企业网站不备案可以吗友链交易平台
  • wordpress mip 主题昆明排名优化
  • 局域网网站建设教程买卖交易平台
  • 怎么自制网站我想接app纯注册推广单
  • 如何seo网站推广昆明seo建站
  • 网站后台怎么建设厦门人才网唯一官方网站
  • 黑龙江农垦建设局网站长春网站建设设计
  • 专业做电脑系统下载网站好免费seo网站诊断免费
  • 建网站需要什么谷歌seo需要做什么的
  • wordpress双栏主题开源南京seo域名
  • 一个网站做两种产品怎么下载app到手机上
  • 兰州网站建设优化手机系统优化软件哪个好
  • 太原建设工程信息网培训seo
  • 网站建设美文线上宣传推广方式
  • php网站开发试题培训机构网站制作
  • mac如何装wordpress搜索关键词排名优化软件
  • 网站建设专业课程做网站平台需要多少钱
  • 股权众筹网站开发今天热搜榜前十名
  • title 芜湖网站制作友情链接官网
  • 莆田哪里有学做网站的免费的推广软件下载