• [转]ASP.NET MVC实现POST方式的Redirect


    本文转自:http://www.cnblogs.com/ryuasuka/p/3604452.html?utm_source=tuicool

    我们知道,在ASP.NET MVC中,要从一个Action跳转到另一个Action,通常是用一系列以“Redirect”开头的方法

    • Redirect
    • RedirectToAction
    • RedirectToRoute

    之类的。

    但是使用Redirect系列的方法进行跳转时,默认是使用GET方法的,也就是说,如果你的跳转请求带有参数,那么这些参数将全部暴露在跳转后的url中,增加了不安全性(特别是如果参数中包含密码、密钥等等敏感数据)

    于是就想到了用POST方法传递数据,这样至少一般的访问者无法从url中获取敏感信息。但是仔细查阅了MSDN和StackOverflow,得到的答案是“Redirect方法不支持POST”。

    好在StackOverflow上找到一个回答 点我  ,倒是给我一些启发。直接POST不行,那就间接POST,先通过一个GET方法获取某个页面,然后以这个页面为中介将数据POST给真正要处理请求的页面。

    下面给出一个示例代码。在这个示例代码中,有两个页面Login和AfterLogin,要求在Login中输入用户名和密码后跳转到AfterLogin,并携带一个由UserAppModel定义的数据列表

    public class UserAppModel
    {
        public string UserId { get; set; }
        public string ClientId { get; set; }
        public string RedirectUri { get; set; }
    }

    这些信息将在使用GET方法加载Login页面时获取。

    复制代码
    public ActionResult Login(string client_id, string redirect_uri)
    {
        HttpCookie cookie = new HttpCookie("app");
        cookie["client_id"] = client_id;
        cookie["redirect_uri"] = redirect_uri;
        Response.Cookies.Add(cookie);
        return View();
    }
    复制代码

    界面设计就省略了,无非是两个文本框和一个submit按钮。

    之后对Login要有个HttpPost方法来接收登录数据,并构造UserAppModel的数据发到新的AfterLogin页面。

    复制代码
    [HttpPost]
    public ActionResult Login(UserModel model)
    {
        if (ModelState.IsValid)
        {
            HttpCookie cookie = Request.Cookies["app"];
            if (cookie != null)
            {
                if (model.UserId == "AAA" && model.Password == "aaa")
                {
                    UserAppModel newModel = new UserAppModel();
                    newModel.UserId = model.UserId;
                    newModel.ClientId = cookie["client_id"];
                    newModel.RedirectUri = cookie["redirect_uri"];
    
                    TempData["model"] = newModel;
                    return RedirectToAction("AfterLogin", "Home");
    
                }
                ViewBag.Message = "Login error! Invalid user ID or password.";
            }
        }
        return View();
    }
    复制代码

    AfterLogin需要两个方法,一个采用GET方式,一个采用POST方式,通过GET方式的页面去调用POST方式的页面,就实现了使用POST的重定向

    复制代码
    //
    // POST: /Home/AfterLogin
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult AfterLogin(UserAppModel model)
    {
        ViewData["model"] = model;
    
        return View(model);
    }
    
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult AfterLogin()
    {
        return AfterLogin(TempData["model"] as UserAppModel);
    }
    复制代码

    结论:Redirect系列方法不支持POST,但是可以通过间接的做法实现POST方式的重定向。

  • 相关阅读:
    linux操作提示:“Can't open file for writing”或“operation not permitted”的解决办法
    CSS中background:url(图片) 不能显示的问题
    CSS3background-size背景图片尺寸属性
    在GitHub上成果预览
    快速上手GitHub上传代码
    css布局模型(1)
    css+div浮动怎么让它在窗口大小变化时不改变位置
    node.js基于express框架搭建一个简单的注册登录Web功能
    node.js 安装使用http-server
    grunt安装与运行
  • 原文地址:https://www.cnblogs.com/freeliver54/p/6404852.html
Copyright © 2020-2023  润新知