FormsAuthentication重定向到登录页后参数重复
网站采用MVC框架和FormsAuthentication认证,在认证失效后点击页面表单提交按钮,会自动跳转到根目录web.config所示loginUrl页面,加上参数ReturnUrl,ReturnUrl=目标页路径;
如果采用post方法,则跳转后Form Data丢失,导致系统出错,当然可以做一些错误提示或处理;
http://localhost:49551/SysAdmins/Index?ReturnUrl=%2fStudent%2fGetStudentListByClass
如果采用get方法,系统会把表单数据附加到参数ReturnUrl后,
http://localhost:49551/SysAdmins/Index?ReturnUrl=%2fStudent%2fGetStudentListByClass%3fcs%3d%26ddlClass%3d3&cs=&ddlClass=3
即参数ReturnUrl和cs、ddlClass,其实ReturnUrl中已经包括了后面两个参数;但这并不影响登录成功后跳转,因为会跳转到参数ReturnUrl所示地址,忽略ReturnUrl之后的参数;
登录页异步提交后,前端获取跳转地址:
function getReturnUrl() { var queryParam = window.location.search.split('?')[1].split('&'); var ReturnUrl; for (var i in queryParam) { var ele = queryParam[i]; if (ele.split('=')[0] == 'ReturnUrl') { ReturnUrl = ele.split('=')[1]; break; } } return ReturnUrl; } //登录成功 if (data == "1") { if (window.location.search.length != 0) { window.location.href = window.location.origin + decodeURIComponent(getReturnUrl()); } else { window.location.href = '@Url.Content(FormsAuthentication.DefaultUrl)'; } } else { $('#ItaInfo').text("用户名或密码错误!"); };
另外,如果表单内有name相同的表单元素,也可以提交,
http://localhost:49551/Student/GetStudentListByClass?cs=&ddlClass=2&cs=
在后台获取时,Request.QueryString["cs"]=",",即所有值用逗号分隔。