文件上传+拦截器——Spring Boot后端学习(二)

该文介绍了在SpringBoot2.6.1环境中,如何配置静态资源路径、处理文件上传,包括最大文件限制,并讲解了MultipartFile接口的使用。同时,文章详细阐述了拦截器的概念,如何创建自定义拦截器LoginInterceptor并进行注册,以及拦截器在权限检查和性能监控中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行环境

jdk 1.8
spring boot 2.6.1
maven 3.9.1
编译器 idea
参照1天搞定SpringBoot+Vue全栈开发的学习笔记

静态资源访问

默认路径:classpath:/static/目录

以下在application.properties中修改

spring.mvc.static-path-pattern=/images/**
可以添加虚拟路径

spring.web.resources.static-locations=classpath:/static
添加新的静态资源路径

文件上传原理

注意一个小坑
修改表单enctype="multipart/from-data"
后端参数名称一定要与表单一致

默认配置:单个文件大小不超过1M,文件总数不超过10MB
以下在application.properties中修改默认文件大小

spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
修改后默认的单个文件不超过10MB

spring.web.resources.static-locations=/upload/
添加新的静态资源路径,使用户上传的文件可以通过静态目录访问

MultipartFile f

用于获取文件f的各项信息

拦截器

权限检查 | 性能监控 | 通用行为

通用行为:
读取cookie得到用户信息并将用户对象放入请求
提取Locale、Theme信息等

HandlerInterceptor接口定义了preHandlepostHandleafterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作

拦截器定义

//定义
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
        //request 前端请求  response 给前端返回对应信息
        System.out.println("LoginInterceptor");
        return true;
    }
}

拦截器注册

要使拦截器定义生效,需要在interceptor包中增加一个WebConfig类,添加@Configuration标记使服务器自动读取配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
    }
}

重写这个addInterceptors增加拦截器的方法,使其new刚刚新建的LoginInterceptor

addPathPatterns("/user/**"):拦截的路径,拦截/user/路径下的全部文件,若没有填写,拦截主目录下所有文件

### 后端接口防抖拦截器实现方案 #### 使用 Spring Boot 中的拦截器防止接口重复提交 为了有效阻止同一请求在短时间内被多次发送,可以利用 Spring MVC 提供的 `HandlerInterceptor` 接口创建自定义拦截器。该机制允许开发者在控制器方法执行前后插入逻辑,从而达到控制访问频率的目的。 当接收到客户端发起的新请求时,服务器会先经过此层过滤再决定是否继续向下游传递。具体来说,在预处理阶段可以通过设置唯一标识符(如 UUID 或时间戳加 MD5 加密后的字符串),并将其存入 Redis 数据库作为缓存键名;如果发现相同 ID 已存在,则认为这是重复操作而拒绝响应[^1]。 ```java import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @Component public class AntiShakeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uniqueKey = generateUniqueKey(request); // 生成唯一的key try (Jedis jedis = redisPool.getResource()) { // 连接到Redis池获取资源 Boolean exists = jedis.exists(uniqueKey); if (!exists) { jedis.setex(uniqueKey, expireTimeInSeconds, "locked"); // 设置过期时间为指定秒数 return true; // 继续向下执行业务逻辑 } else { throw new RuntimeException("Duplicate submission detected."); } } } private String generateUniqueKey(HttpServletRequest req){ StringBuilder sb=new StringBuilder(); Enumeration<String> paramNames=req.getParameterNames(); while(paramNames.hasMoreElements()){ String paramName=paramNames.nextElement(); List<String> params=Collections.list(req.getParameterValues(paramName)); sb.append(paramName).append("=").append(String.join(",",params)).append("&"); } return DigestUtils.md5Hex(sb.toString()); } } ``` 上述代码片段展示了如何基于 HTTP 请求参数构建独一无的 key 来判断是否存在重复提交行为。一旦检测到异常情况便会抛出异常终止流程,并返回相应的错误提示给前端应用。 对于那些可能频繁触发更新动作的功能模块而言——比如表单验证失败后重新加载页面再次点击按钮等情况下的 API 调用——采用此类措施能够显著提升用户体验以及减轻不必要的负载压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值