当接口返回401状态码并且在响应头中设置空字符串的WWW-Authenticate头时,会导致invalid start or end异常

971 阅读1分钟
1、问题现象

java.lang.RuntimeException: java.lang.IllegalArgumentException: invalid start or end

2、原因分析

先定位到报错的HeaderParser类。

任何一步一步往前面的类查看,到达HttpURLConnection类,该类是去请求http,并处理相关的响应逻辑,报错的原因所在也是在这。如图所示,当响应码为401,并且响应头有WWW-Authenticate则最终会走向HeaderParser.parse()。

3、解决方法

接口返回header不带WWW-Authenticate或者设置WWW-Authenticate为null即可。

4、测试代码

TestController

@RestController
public class TestController {

    @GetMapping("/test")
    public void test1(HttpServletResponse response) {
        response.setStatus(401);
        response.addHeader("WWW-Authenticate", "");
    }
}

TestControllerTests

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestControllerTests {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    public void test() {
        restTemplate.getForObject("http://127.0.0.1:8080/test", Object.class);
    }

}