美文网首页.NETC#Asp.net开发
Response.Redirect()重定向之后还会访问原来ac

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

作者: Weidaicheng | 来源:发表于2018-06-13 21:37 被阅读24次

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

    Redirect.png
    浏览器代码如下为302:
    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);
    }
    

    执行结果如下:


    RedirectToAction.png

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


    RedirectToAction 浏览器代码.png

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

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

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

    相关文章

      网友评论

        本文标题:Response.Redirect()重定向之后还会访问原来ac

        本文链接:https://www.haomeiwen.com/subject/xkpseftx.html