HttpServletResponse通过setContentType设置响应头失败,以及解决办法

本文介绍了一个在Spring Cloud Dalston.SR1版本中,使用Spring Boot 1.5.3.Release时遇到的问题,即从Controller直接返回JSON字符串时,content-type被错误地设置为text/plain。文中提供了解决方案,即通过设置@RequestMapping的produces属性来修正content-type。

1 背景

1.1 版本信息

  • springcloud版本:Dalston.SR1
  • springboot版本:1.5.3.Release
  • JDK版本:1.8

1.2 缺陷描述

当我从Controller或者ControllerAdvice直接返回一个JSON字符串时,通过response.setContentType("application/json;charset=UTF-8");失败,前端实际拿到的content-type为text/plain;charset=UTF-8.如果前端对头部有校验的话,很可能会出现拿不到数据的情况.以下为示例代码,当调用/fail接口就可以看到结果

  • 全局异常处理类
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = {Exception.class})
    @ResponseStatus(value = HttpStatus.OK)
    @ResponseBody
    public Object defaultHandler(HttpServletResponse response,Exception e) throws JsonProcessingException {
        log.error(e.getMessage(),e);
        response.setContentType("application/json;charset=UTF-8");
        if(e instanceof PSQLException
                || e instanceof PersistenceException
                || e instanceof MyBatisSystemException
                || e instanceof BadSqlGrammarException){
            return  ResultObject.exception(1,"内部错误:数据库操作失败");
        }

        if(e instanceof HttpHostConnectException
                || e instanceof RetryableException){
            return ResultObject.exception(1,"连接失败:请检查第三方系统接入状态");
        }

        return "{\n" +
                "  \"code\": 1,\n" +
                "  \"msg\": \"未知错误,请联系管理员\"\n" +
                "}";
    }

}
  • controller层代码
@Api(value = "测试", tags = "测试")
@RequestMapping("/test")
@RestController
public class TestController {

    @GetMapping(value = "/fail")
    @ApiOperation("失败")
    public String fail() {
        int i=1/0;
        return "fail";
    }

  
}

swagger调用结果:

  • 响应结果是正常的json串
    在这里插入图片描述
  • 头部信息异常
    在这里插入图片描述

2 解决办法

目前尚未查到具体原因,但是通过设置@RequestMapping中的produces属性可以达到修改响应头的目的

3 总结

当你出现以下状况

  • 响应体为正常json串
  • 通过response的setHeader或者setContentType修改content-type
  • 前端接收的响应头信息为:text/plain;charset=UTF-8
  • controller层返回类型为String,而不是对象

那么!!可以尝试修改RequestMapping代码
@GetMapping(value = "/fail",produces="application/json;charset=UTF-8")


虽然这不是最好的办法,但是可以临时解决一下问题,与君共勉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值