跳到主要内容

网络问题处理

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

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

通过 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