在Jwt.Extensions中重写了Controller类的OnActionExecuting方法来进行token认证,认证失败之后跳转到登陆页面,在其中使用了 Response.Redirect("url")
进行重定向,在使用中发现每次跳转之后还会重新进入原来的action,经过群里大神的指点,可以直接设置context的result来进行跳转,问题得以解决。下面开始问题分析。
建了一个简单的mvc项目,代码如下:
public IActionResult About()
{
_logger.LogWarning("你已进入About");
ViewData["Message"] = "Your application description page.";
return View();
}
public IActionResult Contact()
{
_logger.LogWarning("你已进入Contact");
ViewData["Message"] = "Your contact page.";
return View();
}
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogWarning($"{context.HttpContext.Request.Path.Value} OnActionExecuting");
if(context.HttpContext.Request.Path.Value.Contains("About"))
context.HttpContext.Response.Redirect("/Home/Contact");
else
base.OnActionExecuting(context);
}
其中重写了 OnActionExecuting
方法当进入about action的时候重定向到contact,这里使用的 Response.Redirect
方法
执行结果如下:
浏览器代码如下为302:
可以看到图片中4个warn输出的顺序分别是
1、About action OnActionExecuting
2、进入About action
3、Contact action OnActionExecuting
4、进入Contact action
所以,在执行完 Response.Redirect
方法后还是会进入原来的action,并没有进行拦截。
下面修改 OnActionExecuting
方法代码如下:
public override void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogWarning($"{context.HttpContext.Request.Path.Value} OnActionExecuting");
if(context.HttpContext.Request.Path.Value.Contains("About"))
context.Result = RedirectToAction("Contact");
else
base.OnActionExecuting(context);
}
执行结果如下:
浏览器代码如下同样为302:
可以看到图片中3个warn输出顺序分别是
1、About action OnActionExecuting
2、Contact action OnActionExecuting
3、进入Contact action
所以,直接设置context的result来进行跳转会进行拦截,不再执行之前的action。