@RequestHeader 请求头参数为空异常处理

@RequestHeader 请求头参数为空ServletRequestBindingException异常处理

获取请求头方式

  1. 使用注解 @RequestHeader
@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign") String sign) {
    // ...
}
  1. 从 HTTPServletRequest 中获取
@PostMapping(value = "/test/header")
public void post(HttpServletRequest request) {
    String sign = request.getHeader("sign")
    // ...
}

还原场景

请求头参数为空异常出现的场景:由上面第一种方式通过注解 @RequestHeader 获取请求头 sign 参数时,默认请求头参数时必传的,如果不传的话,接口在获取参数时就会抛出 ServletRequestBindingException 异常:

org.springframework.web.bind.ServletRequestBindingException: Missing request header 'Sign' for method parameter of type String

解决方案

  1. 设置为非必传,在代码中进行必输校验

    @RequestHeader 注解有一个 require 属性,默认为 true,其含义为参数必传。这里将它设置为 false,如果请求头参数没有设置,sign 则为 null。

@PostMapping(value = "/test/header")
public void post(@RequestHeader(value="sign", required = false) String sign) {
    if(sign == null) {
        // return 请求头参数必须传递...
    }
    
    // ...
}
  1. 全局异常处理拦截 ServletRequestBindingException 异常
@ExceptionHandler(value = ServletRequestBindingException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result handleServletRequestBindingException(ServletRequestBindingException e) {
    return Result.of("test", "请求头必须传递");
}

第二种方式虽然可以拦截到请求头缺失导致的异常,也可能拦截其他情况产生的该异常,范围比较宽泛,如果需要针对某一个请求头来处理非空校验的话,可以使用第一种方式。

参考:https://stackoverflow.com/questions/25151264/intercept-requestheader-exception-for-missing-header

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值