Response.Redirect()重定向之后还会访问原来action的问题

在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 方法
执行结果如下:

Response.Redirect()重定向之后还会访问原来action的问题_第1张图片
Redirect.png

浏览器代码如下为302:
Response.Redirect()重定向之后还会访问原来action的问题_第2张图片
Redirect 浏览器代码.png

可以看到图片中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);
}

执行结果如下:


Response.Redirect()重定向之后还会访问原来action的问题_第3张图片
RedirectToAction.png

浏览器代码如下同样为302:


Response.Redirect()重定向之后还会访问原来action的问题_第4张图片
RedirectToAction 浏览器代码.png

可以看到图片中3个warn输出顺序分别是

1、About action OnActionExecuting
2、Contact action OnActionExecuting
3、进入Contact action

所以,直接设置context的result来进行跳转会进行拦截,不再执行之前的action。

你可能感兴趣的:(Response.Redirect()重定向之后还会访问原来action的问题)