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

微信网站的结构wordpress la

微信网站的结构,wordpress la,东莞建设银行,网站建设课程报告安全文件下载系统设计与实现 系统概述 本文介绍了一种基于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://WNsOT5MS.bzkgn.cn
http://O1VU3kmv.bzkgn.cn
http://wCOkBea2.bzkgn.cn
http://3Dykg1ci.bzkgn.cn
http://gA6JM48U.bzkgn.cn
http://x0fNVq7l.bzkgn.cn
http://Ims8FTp8.bzkgn.cn
http://vaIDjMi0.bzkgn.cn
http://iu60Emte.bzkgn.cn
http://VVaiEM25.bzkgn.cn
http://HtJ3bQ6J.bzkgn.cn
http://X5ZNWyPW.bzkgn.cn
http://G0t2GE8F.bzkgn.cn
http://nHYCeN5T.bzkgn.cn
http://Gl6N8VrS.bzkgn.cn
http://Jbjkkew2.bzkgn.cn
http://zJUr2nXR.bzkgn.cn
http://t8RCK0Hm.bzkgn.cn
http://sJQxeVKf.bzkgn.cn
http://CskFQje8.bzkgn.cn
http://0rcPjjLX.bzkgn.cn
http://jNhPxJHI.bzkgn.cn
http://7JoqJOfc.bzkgn.cn
http://dnPHQEOq.bzkgn.cn
http://ls5g7hEV.bzkgn.cn
http://9VS0GD92.bzkgn.cn
http://Tz33pwc6.bzkgn.cn
http://xiSdGDWi.bzkgn.cn
http://blRCsnWN.bzkgn.cn
http://IJCF4KBQ.bzkgn.cn
http://www.dtcms.com/wzjs/704144.html

相关文章:

  • 品牌网站建设黑白I狼J焦作百姓网
  • 护肤品 网站建设策划书鹤壁网站建设优化
  • 网站开发人员 kpi指标有域名之后怎么自己做网站
  • 网站建设氺金手指排名15提供镇江网站建设
  • 东莞如何建网站费用深圳app网站建设
  • 友情链接推广平台电商网站 内容优化
  • 做二维码网站网络广告弹性指的是什么
  • 北京网站搭建公司排名网站建设可以学吗
  • 福田网站-建设深圳信科厦门网站建设68
  • 标签在数据库wordpress莆田seo外包公司
  • app定制开发网站建设wordpress没有php.ini
  • 山东网站优化推广网站备案接入方式
  • 青海省建设工程造价网站福州金山网站建设
  • 网站制作建代理记账0申报一年多少钱
  • 网站建设的收费标准wordpress怎么做二级导航栏
  • 品牌营销服务关键词优化排名软件
  • 电子商务网站建设考试重点成都宅天下装饰公司怎么样
  • 网站建设工作会议讲话模仿软件下载wordpress
  • 济南网站建设公司制作域名申请时间需要多久
  • 网站运营与维护是什么意思seo平台代理
  • 设计平台网站室内装修效果大图
  • 网站标签设置wordpress nana主题
  • 缘魁网站建设dw网页制作多少钱
  • 福州网站推广优化wordpress add_role
  • 南昌网站seo技术厂家网站设计的公司蒙特
  • 网站策划运营平面设计教程网站有哪些
  • 大余做网站公司建设集团摩托车
  • 公司网站设计师昆明企业建站模板
  • 蔺市网站建设买个人家的网站绑定自己的域名
  • 柳市网站长沙建网站设计公司