chenhaozhe
1 天以前 14ae0e21c8660dbb3ac20a5b0d9db9b6dde3cfb9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using Newtonsoft.Json.Linq;
using WebAPI.Utility;
 
 
public class TokenAppendHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(
       HttpRequestMessage request,
       CancellationToken cancellationToken)
        {
            // 1. 先让请求正常执行到 Action
            var response = await base.SendAsync(request, cancellationToken);
 
            try
            {
                // 2. 只处理成功的请求
                if (response.IsSuccessStatusCode && response.Content != null)
                {
                    // 3. 获取旧 token
                    var oldToken = request.Headers.GetValues("token")?.FirstOrDefault();
                    if (string.IsNullOrEmpty(oldToken))
                        return response;
 
                    // 4. 判断是否需要续期
                    bool needRenew = JWTHelper.TokenAboutToExpire(oldToken);
                    if (!needRenew)
                        return response;
 
                    // 5. 生成新 token
                    string newToken = JWTHelper.refreshToken(oldToken);
 
                    // 6. 读取原本的返回数据
                    var json = await response.Content.ReadAsStringAsync();
                    JObject obj;
 
                    if (string.IsNullOrWhiteSpace(json))
                        obj = new JObject();
                    else
                        obj = JObject.Parse(json);
 
                    // 7. 关键:追加 token 字段到返回体
                    obj["token"] = newToken;
 
                    // 8. 替换成新的返回内容
                    response.Content = new StringContent(
                        obj.ToString(),
                        System.Text.Encoding.UTF8,
                        "application/json");
                }
            }
            catch
            {
                
            }
 
            return response;
        }
 
    }