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

建设网站是什么关系百度网盘私人资源链接

建设网站是什么关系,百度网盘私人资源链接,商城网站建设论坛,西安做网站的工资怎么样啊安全文件下载系统设计与实现 系统概述 本文介绍了一种基于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/183414.html

相关文章:

  • wordpress验证登录搜索引擎优化的核心及内容
  • 网站开发 架构设计如何网上免费打广告
  • 乾安网站建设公司电话老域名购买
  • 网站开发设计的技术路线现在如何进行网上推广
  • 权威的网站建设百度热度
  • 网站发展的方向怎么利用互联网推广
  • 商场设计理念站长工具seo
  • 做某个网站接口违法网站推广的方式和方法
  • 外管局网站收汇如何做延期推广网站多少钱
  • 网站建设案例新闻淘宝店铺转让价格表
  • 如何评价一个企业的网站建设武汉seo价格
  • 网站建设 团队介绍qq推广官网
  • 深圳福田专业网站建设网络推广外包哪个公司做的比较好
  • 建设淘宝客网站宁夏百度推广代理商
  • 什么网站有加工外发做的怎样优化标题关键词
  • 淮安网站建设方案为什么外包会是简历污点
  • 网站的建设期手游推广个人合作平台
  • 做网站都需要什么查询网站服务器
  • 做效果图的网站有哪些小程序开发流程详细
  • mac用什么软件做网站漂亮的网页设计
  • 四川网站建设哪家好凡科网
  • 广州seo网络推广员北京专业网站优化
  • 做网站后期需要什么费用2345网址导航浏览器
  • 开发公司 网站建设价格深圳华强北新闻最新消息今天
  • 苏州专业高端网站建设公司哪家好百度风云榜游戏排行榜
  • 自己做服装搭配的网站廊坊百度关键词优化怎么做
  • 普通网站和营销型网站的区别济宁百度推广开户
  • 企业展厅制作seo站内优化和站外优化
  • 网站优化推广方案百度seo是什么
  • 做网站需要注册那些类别的商标百度排名优化