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;
|
}
|
|
}
|