Java后端接收HTML反馈数据需用POST方法并设UTF-8编码,Spring Boot中用@PostMapping+@RequestParam接收字段,配合@Valid校验、时间窗口去重及日志/数据库脱敏保障安全可靠。
用户点击“提交反馈”按钮后,表单数据必须被Java后端正确解析并落库,否则整个系统形同虚设。核心在于区分请求方法、编码方式和参数获取方式。
request.getParameter("content") 获取,但长度受限,且明文暴露,不适用于反馈内容这类可能含中文、换行的长文本method="post",且服务端调用 request.setCharacterEncoding("UTF-8") 在 getParameter 之前执行,否则中文变乱码getParameter,必须用 Part API 或 Apache Commons FileUpload不用写Servlet配置,直接用注解驱动,但几个关键点漏掉就会400或空值。
对应后端 @PostMapping("/api/feedback")
@RequestParam 接收普通字段(如 name、email),用 @RequestBody 仅当前端发的是JSON(此时需设 Content-Type: application/json)@RequestParam("user_email") String email 显式映射@NotBlank 注解 + @Valid,但控制器方法参数必须是对象封装,不能是单个String@PostMapping("/api/feedback")
public ResponseEntity handleFeedback(
@RequestParam String content,
@RequestParam String contact,
@RequestParam(required = false) String type) {
// content可能为空字符串而非null,注意判空逻辑
if (content == null || content.trim().isEmpty()) {
return ResponseEntity.badRequest().body("反馈内容不能为空");
}
feedbackService.save(content, contact, type);
return ResponseEntity.ok("已收到");
}
用户手抖连点两次,或者脚本批量发请求,后端没防护就会存两条一模一样的反馈,还可能压垮数据库。
button.disabled = true,但纯靠前端不可信429 Too Many Requests
,后端检查该值距当前时间是否超10秒,超则拒绝(防缓存重放)
逻辑反馈内容可能含手机号、邮箱、身份证号甚至密码明文,直接打全量日志等于泄露用户隐私。
****,邮箱@前保留首尾各1字符,如 a***@b**.com
request.getParameterMap() 全量输出——里面可能有任意字段log.info("收到反馈: {}", content),改用结构化日志字段:log.info("feedback_submitted", "contact", maskEmail(contact), "content_len", content.length())