微信头像地址失效

文章目录
  1. 1. 对比
    1. 1.1. 无法访问的图片响应内容
    2. 1.2. 正常访问的图片响应
  2. 2. 获取响应代码
  3. 3. 总结

开发过程中为了用户体验,没有限制用户上传图片,产品一定要有图片,用户没有上传图片情况下就使用用户头像,头像地址是存在数据库的,当用户微信头像换了,或者其他原因无法保证图片一定有效,就会导致项目中的图片无法查看,被用户投诉。

对比

无法访问的图片响应内容

1
2
3
4
5
6
7
8
9
10
Cache-Control: no-cache
Content-Length: 5093
Content-Type: image/png
Last-Modified: Mon, 01 Jan 1990 00:00:00 GMT
Server: ImgHttp3.0.0
X-BCheck: 0_0
X-Cpt: filename=0
X-ErrNo: -6101
X-Info: notexist:-6101
X-RtFlag: 0

正常访问的图片响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cache-Control: max-age=2592000
chid: 0
Content-Length: 3558
Content-Type: image/jpeg
fid: 0
Last-Modified: Sun, 03 Nov 2019 20:50:59 GMT
Server: ImgHttp3.0.0
Size: 3558
User-ReturnCode: 0
Vary: Accept,Origin
X-BCheck: 0_1
X-Cpt: filename=0
X-DataSrc: 0
X-Delay: 4443 us
X-Info: real data
X-ReqGue: 0

通过对比可以发现,可以根据X-Info: notexist:-6101 判断或者 X-ErrNo: -6101 关键字

注意,不能通过状态去判断,因为都是返回200的状态的

获取响应代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public static boolean checkWechatPhoto(String photoUrl) {
try {
URL url = new URL(photoUrl);
URLConnection conn = url.openConnection();

Map headers = conn.getHeaderFields();
Set<String> keys = headers.keySet();
for (String key : keys) {
String val = conn.getHeaderField(key);
// System.out.println(key + "    " + val);
// System.out.println(conn.getLastModified());
if(StringUtils.isNotEmpty(key) && key.equalsIgnoreCase("X-ErrNo")){
if(val.equalsIgnoreCase("-6101")){
return false;
}else{
break;
}
}
}
} catch (Exception e) {
log.error(e.getMessage());
}
return true;
}

总结

后续的处理需要结合你的业务处理,可以写个定时任务,定时去处理这些无法访问的图片,也可以写个线程用户触发的时候去判断处理,方法很多这里不一一举例了。

评论