本文转自: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方式的重定向。

最新文章

  1. mySql常用函数说明
  2. JS九大内置对象
  3. 史航416第11次作业&总结
  4. wireshark使用
  5. vs2010 快捷键大全 (转)
  6. [C#]Linq To Xml 实例操作- 转
  7. UNDO表空间设置
  8. html学习笔记之position
  9. 给Eclipse安装Google app engine插件
  10. 利用Comparator排序
  11. 基于visual Studio2013解决C语言竞赛题之0611素数排序
  12. Windows编译Nodejs时遇到 File "configure", line 313 SyntaxError: invalid syntax Failed to create vc project files. 时的解决方法
  13. ubuntu14.04 安装 tensorflow
  14. Lucky7(容斥原理)
  15. 1692: [Usaco2007 Dec]队列变换|后缀数组|贪心
  16. 利用while语句,条件为输入的字符不为'\n'.
  17. Kafka--消息队列
  18. Sobel 边缘检测算子
  19. linux学习笔记整理(四)
  20. Mysql5.5安装

热门文章

  1. k8s学习笔记(一)
  2. 3人从小公寓创业,到世界最大引擎公司,Unity创始人谈14年...
  3. Ext中setValue和setRawValue
  4. python—Celery异步分布式
  5. yunpian-python-sdk
  6. get与post中文乱码问题
  7. Jenkins持续集成企业实战系列之Jenkins手动构建-----04
  8. Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
  9. AtCoder - 2566 优先队列
  10. Touchable类组件