马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Web 应用开辟中,文件下载功能是常见需求。但由于跨域限定和认证机制的复杂性,现实开辟中常碰到下载失败或权限错误等标题。本文将团结 Vue 前端和 Spring Boot 后端,详细先容文件下载功能的实现与跨域标题的办理方案。
一、标题配景
在某观察体系中,文件下载功能碰到以下典范标题:
- 前端访问 /api/ssp/**/download 接口时提示跨域错误
- 未认证用户无法直接访问下载链接
- 下载文件时出现 401 Unauthorized 错误
焦点标题在于:
- 跨域资源共享(CORS)限定
- 安全设置过于宽松导致的权限弊端
- JWT 认证机制与下载接口的兼容性标题
二、办理方案架构
1. 安全设置优化
将 Spring Security 设置中的 URL 匹配模式从 /api/ssp/** 改为更详细的 /api/ssp/**/download,仅答应下载接口匿名访问:- @Configuration
- @EnableWebSecurity
- public class SecurityConfig {
- @Bean
- public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
- http.cors().and().csrf().disable()
- .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
- .and()
- .authorizeRequests()
- .antMatchers("/api/login", "/api/register", "/api/captcha").permitAll()
- .antMatchers("/api/ssp/**/download").permitAll() // 仅允许下载接口
- .anyRequest().authenticated();
- http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
- return http.build();
- }
- }
复制代码 2. CORS 全局设置
添加 CORS 设置类,答应全部源和哀求方法:- @Configuration
- public class WebConfig implements WebMvcConfigurer {
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**")
- .allowedOriginPatterns("*")
- .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
- .allowedHeaders("*")
- .allowCredentials(true)
- .maxAge(3600);
- }
- }
复制代码 三、后端文件下载实现
1. 文件存储服务集成
利用 MinIO 举行文件存储,实现下载接口:- @RestController
- @RequestMapping("/api/ssp")
- public class DownloadController {
- @Autowired
- private MinioUtils minioUtils;
- @GetMapping("/{project}/download")
- public void downloadFile(@PathVariable String project,
- String objectName,
- HttpServletResponse response) {
- try {
- String fullPath = project + "/" + objectName;
- minioUtils.fileDownload(fullPath, response);
- } catch (Exception e) {
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- e.printStackTrace();
- }
- }
- }
复制代码 四、前端调用实现
1. 基于 Axios 的下载方法
利用 defHttp.get 方法并处理惩罚相应流:- export const downloadFile = async (fileName: string, params: any) => {
- try {
- const response = await defHttp.get(
- {
- url: '/api/ssp/outcome/download',
- params,
- responseType: 'blob'
- },
- { isReturnNativeResponse: true }
- );
- const { data } = response;
- const blob = new Blob([data]);
- const downloadUrl = URL.createObjectURL(blob);
- const link = document.createElement('a');
- link.href = downloadUrl;
- link.download = fileName;
- link.click();
- URL.revokeObjectURL(downloadUrl);
- } catch (error) {
- // 错误处理逻辑
- }
- };
复制代码 2. 错误处理惩罚加强
添加相应数据校验和错误提示:- if (data.size < 1024 && contentType.includes('json')) {
- const errorInfo = JSON.parse(await data.text());
- if (errorInfo.code === 401) {
- message.error('登录超时,请重新登录');
- router.push('/login');
- }
- }
复制代码 五、测试与验证
- curl -o report.pdf http://localhost:8080/api/ssp/project/download?objectName=report.pdf
复制代码 2.前端页面调用: - <a @click="downloadFile('report.pdf', { project: 'project1' })">下载报告</a>
复制代码 3.非常场景测试:
- 未登录状态下访问下载链接
- 错误的文件路径哀求
- 大文件下载压力测试
六、常见标题与办理
- 跨域错误:
- 查抄 CORS 设置是否精确
- 确保相应头包罗 Access-Control-Allow-Origin
- 401 未授权:
- 确认下载接口是否设置为 permitAll()
- 查抄 JWT 过滤器是否扫除了下载路径
- 文件粉碎:
- 验证文件流处理惩罚是否精确关闭
- 查抄相应头 Content-Type 设置
七、总结
通过以下关键步调可以安全高效地实现文件下载功能:
- 精致化安全设置,限定下载接口权限
- 全局 CORS 设置办理跨域标题
- 前后端协同处理惩罚文件流和非常
- 美满的错误提示与用户引导
本文提供的方案已在现实项目中验证,可有效办理文件下载功能中的跨域和权限标题,确保用户体验和体系安全性。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |