跳到主要内容

网络问题处理

浏览器在访问钉钉开发文档的时候很慢​

第一眼以为请求走的是代理。

通过 chrome 的控制台,查看这个页面有哪些请求。

通过检查 clash 设置后发现,所有的请求都是直连。

最后发现,是因为使用的禁用缓存插件,导致每次请求都下载 js 等静态资源。

通过 postman 请求返回乱码​

1、postmand 端处理​

curl --location 'http://dd:8080/sjjk/region'

postman 添加 Accept: application/json;charset=UTF-8 请求头即可。

curl --location 'http://dd:8080/sjjk/org' \
--header 'Accept: application/json;charset=UTF-8'

2、服务端处理​

@RequestMapping("/region")  
@ResponseBody
public String region() throws IOException {
InputStream in = ActionSjjk.class.getResourceAsStream("/sjjk/region.json");
try {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}finally {
in.close();
}
}

springboot 代码加入 produces = "application/json;charset=UTF-8"

@RequestMapping(value = "/region", produces = "application/json;charset=UTF-8")  
@ResponseBody
public String region() throws IOException {
InputStream in = ActionSjjk.class.getResourceAsStream("/sjjk/region.json");
try {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}finally {
in.close();
}
}

请求 https 地址时报错​

报错信息 : PKIX path building failed

Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
... 96 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 102 more

问题排查过程

  1. 通过浏览器访问 https 地址,查看是谁颁发的证书
  2. 如果是自签发的证书,需要将证书加到 jdk 的信任列表中
  3. 如果是信任的机构颁发的,则需要通过域名访问(可以在 hosts 单独配置一条 host 记录)

问题原因

请求的 https 地址所使用的证书是自签发的,没有在 jdk 的信任列表中。

将自签发证书导入到 jdk 的信任列表​

  1. 通过下面的命令查看问题
java SSLPoke baidu.com 443
  1. 执行脚本
# 导入证书到 jdk 的信任列表中
./java-cert-importer.sh baidu.com 443
# 删除证书
./java-cert-importer.sh baidu.com 443 -d
  1. 验证证书是否导入成功
java SSLPoke baidu.com 443

HTTP 状态码​

1xx:信息性状态码,指示请求已被接收并继续处理。

100 Continue:服务器已接收请求的初始部分,客户端应继续发送剩余部分。

101 Switching Protocols:服务器要求客户端切换协议。

2xx:成功状态码,指示请求已成功被接收、理解、并接受。

200 OK:请求成功,返回请求的数据。

201 Created:请求成功并且服务器创建了新的资源。

204 No Content:请求成功,但没有返回任何内容。

3xx:重定向状态码,指示需要客户端采取进一步的操作才能完成请求。

301 Moved Permanently:请求的资源已永久移动到新位置。

302 Found:请求的资源暂时移动到其他位置。

304 Not Modified:客户端的缓存资源是最新的,无需重新传输。

4xx:客户端错误状态码,指示请求包含语法错误或无法完成请求。

400 Bad Request:请求有语法错误或参数错误。

401 Unauthorized:请求需要用户身份验证。

403 Forbidden:禁止访问。

404 Not Found:请求的资源不存在。

5xx:服务器错误状态码,指示服务器在处理请求时发生了错误。

500 Internal Server Error:服务器遇到了未知的错误。

503 Service Unavailable:服务器暂时无法处理请求,可能是过载或维护中。

504 Gateway Timeout:服务器作为网关或代理,未及时从上游服务器收到请求的响应。

400​

  1. bad request 意思是 "错误的请求";
  2. invalid hostname 意思是 "不存在的域名"。

bad request

1、请求 URL 中包含特殊字符 {}

http://localhost:12581/ei/taskdesign.do?action=importport&filetype=json&taskid={654c76d6-ce5c-bbdd-cb35-2cdec155099e}

需要对 taskid 进行 encodeURI(taskid) 转义

invalid hostname