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

Jeecg,登录才能下载文件

本文针对Jeecg 3.8.2版本,其他版本也基本通用,可参考调整。

1 背景

上传到系统的文件,可能会要求登录状态才能下载,或者下载时须记录日志,用于查看哪个用户什么时间下载了什么文件。但是系统默认的文件是上传到静态资源目录的,即使前端页面看不到,只要有链接就能下载。

2 限权文件

2.1 后端

2.1.1 配置权限

ShiroConfig.java文件中做如下修改:

@Bean("shiroFilterFactoryBean") public ShiroFilterFactorBean shiroFilter(SecurityManager securityManager) { ... // 将“anon”改为“jwt” filterChainDefinitionMap.put("/sys/common/static/**", "jwt"); ... }

2.1.2 返回文件内容

CommonController.java文件修改如下:

@GetMapping(value = "/static/**") public void view(HttpServletRequest request, HttpServletResponse response) { ... try { ... outputStream = response.getOutputStream(); // Img目录下的不必鉴权 if (!imgPath.startsWith("Img/") && !imgPath.startsWith("/Img/")) { // 登录用户才能下载 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); if (loginUser == null) { OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); BufferedWriter bufferedWriter = new BufferedWriter(writer); bufferedWriter.write("未登录,无法下载!"); response.setStatus(403); try { outputStream.close(); } catch (IOException e) { log.error(e.getMessage(), e); } return; } } ... } ... }

2.2 前端

window.open(url)改为downloadFileWithToken(url)即可。

import { getToken } from '/@/utils/auth'; function downloadFileWithToken(url) { fetch(url, { method: 'GET', headers: { 'X-Access-Token': getToken(), } }).then(response => { if (!response.ok) { throw new Error(response.statusText) } return response.blob(); }).then(blob => { { // 将请求到的内容直接保存为文件 const blobUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = blobUrl; link.download = url.indexOf('/') > -1 ? url.split('/')[url.split('/').length - 1] : url; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(blobUrl); } }).catch(error => { //createMessage.warning(error.message) }) }

3 不限权文件

用户头像等不想限制权限时,另外配置即可。

3.1 后端

3.1.1 配置权限

ShiroConfig.java文件中做如下修改:

@Bean("shiroFilterFactoryBean") public ShiroFilterFactorBean shiroFilter(SecurityManager securityManager) { ... // 增加 filterChainDefinitionMap.put("/sys/common/static/Img/**", "anno"); // 将“anon”改为“jwt” filterChainDefinitionMap.put("/sys/common/static/**", "jwt"); ... }

3.1.2 返回文件内容

如2.1.2所示。

3.2 前端

upload.ts文件修改如下:

... export function uploadImg(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) { // ----begin----(上传到指定目录) if (params.data) { params.data = { ...params.data, biz: "Img" } } else { params.data = { biz: "Img" } } // ----end----(上传到指定目录) return defHttp.uploadFile<UploadApiResult>( { url: `/sys/common/upload`, // 原先代码有误 onUploadProgress, }, params, { isReturnResponse: true } ); } ...
http://www.jsqmd.com/news/472928/

相关文章:

  • Java 开发上门家政服务预约平台 小程序 + 管理后台源码
  • 基于平方根容积卡尔曼(SRCKF)的附着系数与车辆状态联合估计
  • 第六部分 — 网络、安全和规则 webRequest(剩余功能,替代方案)
  • 探索基于树的UI框架的统一模型
  • web安全防护指南,web安全入门(非常详细)从零基础入门到精通,收藏这篇就够了
  • 【qml】qt导出excel引入QXlsx库
  • 怎么降AIGC率?学姐盘点3个好用的降AI工具及5个手改技巧指南
  • 为什么 iOS MTU=517,但 BLE 吞吐量通常只有 6~8KB/s?
  • 潮玩解锁新方式!扭蛋机盲盒小程序前端功能玩法解析
  • 通过Clonezilla Live USB制作完整ubuntu系统克隆
  • 商协会换届流程
  • 宠物食品市场综合分析与发展规划
  • 人肉防火墙:用生理反应阻断黑客攻击——软件测试从业者的专业视角
  • loader加载器
  • 北京婚礼策划公司排名
  • 你的“情感算法”,正在如何左右你的恋爱选择?——从依恋理论看亲密关系的底层代码
  • 孩子不敢说、学校发现晚?朗心科技用数智化筑起心育“防火墙”
  • 2026更新版!AI论文网站 千笔·专业学术智能体 VS 文途AI,专科生写作新选择!
  • 【分布式】Hadoop完全分布式的搭建(零基础)
  • 不懂技术怎么做题库小程序?我把经验写下来了,你看看
  • MATLAB与Simulink联合仿真:车辆二自由度动力学模型验证及对比分析
  • 初探COMSOL之混凝土Mazars拉伸损伤模型
  • 魔术轮胎公式验证:一场数值与现实的碰撞
  • 2026年玩具喷涂废气治理优质厂家推荐榜
  • COMSOL 3D脉冲激光刻槽:探索微观世界的神奇工艺
  • 实训2 MySQL zip安装
  • 员工AI培训别乱搞!漫无目的的课程等于“烧钱”没效果
  • 亲测!防爆阀门定位器企业实践案例分享,效果惊人
  • OpenClaw浏览器在Linux中的配置指南
  • AI时代传播新范式:情绪让位于理性,流量让位于权重,浅传播让位于深传播