spring boot 分页参数需主动校验边界,pagenum 应为 1–1000、pagesize 为 1–100;推荐用 @validated + 自定义注解校验 get 参数,@valid 校验 post json 参数,并在 service 层做安全截断兜底。

Spring Boot 中对分页参数(如 pageNum、pageSize)做边界校验,核心目标是防止非法值引发 SQL 异常、内存溢出或数据库性能问题(比如传入 pageSize=1000000 或 pageNum=-1)。这不是靠 PageHelper 自动完成的,必须由开发者主动拦截和约束。
明确合法范围并统一限制
分页参数本质是业务约定,不是技术自由值。建议在应用层硬性规定合理区间:
-
pageNum:最小为
1(第一页),最大建议不超过1000(避免深度翻页); -
pageSize:最小为
1,最大建议设为100或200(兼顾体验与性能); - 超出范围时,可直接拒绝请求,或自动归正(如
pageNum=0 → 1,pageSize=500 → 100),需按团队规范选择策略。
用 @Validated + 自定义注解校验查询参数
对于 GET 请求的分页参数(如 /users?pageNum=1&pageSize=20),推荐使用 @Validated 配合自定义校验注解,比写一堆 if 更清晰、可复用:
- 定义一个
@Pageable注解,标注在封装分页参数的 DTO 或 Controller 方法参数上; - 实现对应的
PageableValidator,检查pageNum > 0、pageSize ∈ [1, 100]等逻辑; - Controller 方法签名示例:
public Result list(@Validated @Pageable PageQuery query); - 校验失败时抛
ConstraintViolationException,由全局异常处理器统一返回友好提示(如“页码必须大于0”)。
对 @RequestBody 分页对象启用嵌套校验
若分页参数以 JSON 形式放在请求体中(如 POST /search),则在 DTO 中直接加校验注解:
- DTO 示例:
public class PageQuery {<br> @Min(value = 1, message = "页码不能小于1")<br> private Integer pageNum = 1;<br><br> @Min(value = 1)<br> @Max(value = 100, message = "每页最多显示100条")<br> private Integer pageSize = 20;<br>} - Controller 使用
@Valid @RequestBody PageQuery query; - Spring 会自动触发字段级校验,失败抛
MethodArgumentNotValidException,同样交由全局异常处理器捕获。
在 Service 层做兜底防御(可选但推荐)
即使前端和 Controller 已校验,Service 调用 PageHelper 之前仍建议再做一次安全截断:
- 例如:
int safePageNum = Math.max(1, Math.min(query.getPageNum(), 1000)); - 调用
PageHelper.startPage(safePageNum, safePageSize)前确保参数可控; - 这对防止绕过 Controller 校验(如内部 RPC 调用、测试脚本直连)很有效,属于纵深防御。











