You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot返回验证码响应乱码求助:已设UTF-8仍无效

问题解决:SpringBoot返回验证码图片乱码

核心问题分析

你的代码存在两个关键错误:

  • 重复设置response.setContentType:先设置了正确的图片类型image/gif,随后又被text/html;charset=UTF-8覆盖,导致客户端把二进制图片流当成HTML文本解析,直接引发乱码
  • 针对图片二进制流设置setCharacterEncoding("utf-8")完全多余:字符编码仅针对文本内容生效,二进制图片不需要这一配置

修正后的代码

@Controller
@Slf4j
public class SeckillGoodsController {
    @Autowired
    RedisTemplate redisTemplate;

    @GetMapping("/captcha")
    public void verifyCode(Long userId, Long goodsId, HttpServletResponse response) {
        // 设置缓存控制头,确保每次请求都返回新验证码
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 设置正确的响应类型:GIF图片
        response.setContentType("image/gif");

        ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 32, 3);
        redisTemplate.opsForValue().set("captcha:" + userId + ":" + goodsId, captcha.text(), 60, TimeUnit.SECONDS);
        try {
            // 直接输出图片二进制流,无需打印OutputStream的toString(仅输出对象地址,无实际意义)
            captcha.out(response.getOutputStream());
        } catch (IOException e) {
            log.error("生成验证码失败", e);
        }
    }
}

额外注意事项

  • Postman测试时,确保请求的Accept头包含image/gif或image/*,Postman通常会自动识别,若仍有问题可手动配置
  • 如果ArithmeticCaptcha生成的是PNG格式图片,需对应修改response.setContentType为image/png

内容的提问来源于stack exchange,提问作者DongYanzuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:45:40