控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

ASP.NET MVC实现POST方式的Redirect

作者:ComponentCN 出处:ComponentCN 2014年03月17日 阅读:

我们知道,在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方式的重定向。

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统