(一)IAuthorizationFilter(权限过滤器),IFilterMetadata(自定义过滤器),IExceptionFilter(异常过滤器),IActionFilter(action过滤器)的定义和使用

1:(权限过滤器)结合(自定义过滤器)使用

(权限过滤器写在OnAuthorization里面的方法会自动执行,action过滤器,exception过滤器都有对应的On方法),自定义过滤器里面定义的方法需要调用,呢是他们的区别

以下就是在权限过滤器里面执行自定义过滤器里面的方法:

public sealed class LoginAttribute : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.Filters
.Where(item => item is IZdyFilter)
.FirstOrDefault() is IZdyFilter tokenFilter)
{
tokenFilter.OnAuthorization1(context);
return;
}

string ss = context.HttpContext.Request.Query["name"];
if (ss == "1111")
{
context.Unauthorized("没有进入action");
}
}
}
#endregion

#region 自定义过滤器
public interface IZdyFilter : IFilterMetadata
{
AuthorizationFilterContext OnAuthorization1(AuthorizationFilterContext context);
}
public sealed class ZdyAttribute : Attribute, IZdyFilter
{
public AuthorizationFilterContext OnAuthorization1(AuthorizationFilterContext context)
{
string ss = context.HttpContext.Request.Query["name"];
if (ss == "0000")
{
context.Unauthorized("没有进入action0000");
}
return context;
}
}
#endregion

 

 2:异常过滤器,发生异常时候执行,通过context.Exception.Message把异常信息返回给客户端

#region 异常过滤器
public sealed class Login1Attribute : Attribute, IExceptionFilter
{
public void OnException(ExceptionContext context)
{

context.Exception(context.Exception.Message);
}
}
#endregion

3:action过滤器

#region action过滤器 进入action之前执行,比如请求需要带上某些值,否则不然请求action方法
public sealed class ActionLoginAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{

}

public void OnActionExecuting(ActionExecutingContext context)
{
string ss = context.HttpContext.Request.Query["name"];
if (ss == "1111")
{
context.Action("没有进入action");
}
}
}
#endregion

 

4:没有正常访问接口后需要对应的异常提示类(为context指定Result以后就不会继续请求接口了,相当于context.Result是一个终结的,直接向前端响应对应的信息了)

public static class CommMeessag
{
public static AuthorizationFilterContext FilterResult(this AuthorizationFilterContext context, HttpStatusCode statusCode, string result, string message = null, bool status = false)
{
context.Result = new ContentResult()
{
Content = new { message, status = status, code = (int)statusCode, result }.Serialize(),
ContentType = "application/json",
StatusCode = (int)statusCode
};

return context;
}
public static AuthorizationFilterContext Unauthorized(this AuthorizationFilterContext context, string message = null)
{
return context.FilterResult(HttpStatusCode.Unauthorized, "denied", message);
}

 

 

public static ExceptionContext FilterResultException(this ExceptionContext context, HttpStatusCode statusCode, string result, string message = null, bool status = false)
{
context.Result = new ContentResult()
{
Content = new { message, status = status, code = (int)statusCode, result }.Serialize(),
ContentType = "application/json",
StatusCode = (int)statusCode
};

return context;
}
public static ExceptionContext Exception(this ExceptionContext context, string message = null)
{
return context.FilterResultException(HttpStatusCode.Unauthorized, "denied", message);
}

 

public static ActionExecutingContext FilterResultAction(this ActionExecutingContext context, HttpStatusCode statusCode, string result, string message = null, bool status = false)
{
context.Result = new ContentResult()
{
Content = new { message, status = status, code = (int)statusCode, result }.Serialize(),
ContentType = "application/json",
StatusCode = (int)statusCode
};

return context;
}
public static ActionExecutingContext Action(this ActionExecutingContext context, string message = null)
{
return context.FilterResultAction(HttpStatusCode.Unauthorized, "denied", message);
}

 

public static string Serialize(this object obj, JsonSerializerSettings formatDate = null)
{
if (obj == null) return null;
formatDate = formatDate ?? new JsonSerializerSettings
{
DateFormatString = "yyyy-MM-dd HH:mm:ss"
};
return JsonConvert.SerializeObject(obj, formatDate);
}
}

posted @   yingxianqi  阅读(750)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示