BaseFilter.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using Microsoft.AspNetCore.Mvc.Filters;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.Extensions.Caching.Distributed;
  4. using System.Net;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.AspNetCore.Http;
  7. using EasyTemplate.Tool;
  8. using EasyTemplate.Tool.Entity;
  9. using EasyTemplate.Tool.Util;
  10. namespace EasyTemplate.Service;
  11. /// <summary>
  12. /// 全局异常
  13. /// </summary>
  14. public class ApiExceptionAttribute : Attribute, IExceptionFilter
  15. {
  16. public void OnException(ExceptionContext context)
  17. {
  18. Cache.Increase($"request_error_{DateTime.Now.ToString("yyyyMMdd")}");
  19. Log.Error(context.Exception);
  20. var ex = context.Exception as FriendlyException;
  21. if (ex != null)
  22. {
  23. switch (ex.StatusCode)
  24. {
  25. //处理400状态码
  26. case StatusCodes.Status400BadRequest:
  27. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, ex.ValidationException ? ex.ErrorMessage.ToString() : "400 请求失败", false));
  28. context.ExceptionHandled = true;
  29. break;
  30. //处理401状态码
  31. case StatusCodes.Status401Unauthorized:
  32. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "401 登录已过期,请重新登录", false));
  33. context.ExceptionHandled = true;
  34. break;
  35. //处理403状态码
  36. case StatusCodes.Status403Forbidden:
  37. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "403 禁止访问,没有权限", false));
  38. context.ExceptionHandled = true;
  39. break;
  40. //处理404状态码
  41. case StatusCodes.Status404NotFound:
  42. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "404 未找到", false));
  43. context.ExceptionHandled = true;
  44. break;
  45. //处理500状态码
  46. case StatusCodes.Status500InternalServerError:
  47. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "500 内部服务器错误", false));
  48. context.ExceptionHandled = true;
  49. break;
  50. case 600:
  51. context.Result = new JsonResult(Result.Fail(HttpStatusCode.BadRequest, $"{ex.ErrorCode} {ex.Message}", false));
  52. context.ExceptionHandled = true;
  53. break;
  54. default:
  55. context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, $"{ex.StatusCode} 应用内错误", false));
  56. context.ExceptionHandled = true;
  57. break;
  58. }
  59. }
  60. else
  61. {
  62. context.Result = new JsonResult(Result.Fail(Message: $"400 应用内错误", Data: false));
  63. context.ExceptionHandled = true;
  64. }
  65. }
  66. }
  67. /// <summary>
  68. /// 实现自定义授权
  69. /// </summary>
  70. public class ApiAuthorizeAttribute : Attribute, IAuthorizationFilter
  71. {
  72. /// <summary>
  73. /// 请求验证,当前验证部分不要抛出异常,ExceptionFilter不会处理
  74. /// </summary>
  75. /// <param name="context"></param>
  76. public void OnAuthorization(AuthorizationFilterContext context)
  77. {
  78. if (context.ActionDescriptor.EndpointMetadata.OfType<AllowAnonymousAttribute>().Any())
  79. {
  80. Cache.Increase($"request_{DateTime.Now.ToString("yyyyMMdd")}");
  81. Cache.Increase($"request_total");
  82. return;
  83. }
  84. if (context.HttpContext.Response.StatusCode == 200)
  85. {
  86. string token = context.HttpContext.Request.Headers["Authorization"];
  87. if (string.IsNullOrEmpty(token))
  88. {
  89. context.Result = new JsonResult(Result.Fail(HttpStatusCode.Forbidden, "非法请求", false));
  90. }
  91. else
  92. {
  93. try
  94. {
  95. token = token.Replace("Bearer ", "");
  96. var info = Jwt.Deserialize(token, out DateTime expired);
  97. if (expired.Subtract(DateTime.Now).TotalSeconds > 0)
  98. {
  99. Global.UserId = info.UserId;
  100. Cache.Increase($"request_{DateTime.Now.ToString("yyyyMMdd")}");
  101. Cache.Increase($"request_total");
  102. context.HttpContext.Session.SetString("userid", info.UserId.ToString());
  103. context.HttpContext.Session.SetString("username", info.Name);
  104. }
  105. else
  106. {
  107. context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "token已过期", false));
  108. }
  109. }
  110. catch
  111. {
  112. context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "token格式不正确", false));
  113. }
  114. }
  115. }
  116. else if (context.HttpContext.Response.StatusCode == 401)
  117. {
  118. context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "请先登录", false));
  119. }
  120. }
  121. }
  122. /// <summary>
  123. ///
  124. /// </summary>
  125. public class ApiResultAttribute : Attribute, IResultFilter
  126. {
  127. public void OnResultExecuted(ResultExecutedContext context)
  128. {
  129. // 在结果执行之后调用的操作...
  130. }
  131. public void OnResultExecuting(ResultExecutingContext context)
  132. {
  133. if (context.Result is BadRequestObjectResult vresult)
  134. {
  135. if (vresult.Value is ValidationProblemDetails detail)
  136. {
  137. context.Result = new JsonResult(new Result() { Code = HttpStatusCode.BadRequest, Message = "字段验证失败", Data = detail.Errors.ToList() });
  138. return;
  139. }
  140. }
  141. if (context.Result is ObjectResult result)
  142. {
  143. context.Result = new JsonResult(new Result() { Code = (HttpStatusCode)context.HttpContext.Response.StatusCode, Message = "成功", Data = result?.Value });
  144. return;
  145. }
  146. }
  147. }