Vấn đề mất mật khẩu trong postback có thể tránh việc sử dụng của Asynchronous JavaScript cuộc gọi, cho phép mô tả một kịch bản điển hình cho một trang Login:
phép nói rằng chúng tôi có một trang đăng nhập cho phép người dùng thay đổi ngôn ngữ của nhãn của nó khi người dùng chọn một ngôn ngữ với một DropDownList
một giải pháp sẽ được gọi SelectedIndexChanged sự kiện của DropDownList, làm một postback mà đi đến máy chủ và chọn lên các nhãn trong ngôn ngữ đã chọn.
trong trường hợp này, mật khẩu trường sẽ bị mất do tính năng bảo mật của ASP.NET làm cho các trường mật khẩu không được duy trì giữa một lần đăng lại.
Kịch bản này có thể được giải quyết nếu việc postback tránh sử dụng công nghệ JavaScript không đồng bộ và XML (Ajax).
Thêm một hàm javascript mà sẽ được gọi từ sự kiểm soát DropDownList, trong trường hợp này chức năng này được gán cho tài sản của DropDownList lệnh trong mã đằng sau:
function ValueChanged(div)
{
var table = div.getElementsByTagName("table");
if (table && table.length > 0)
{
var t = table[0].getAttribute('type');
if (t != null && (t == "DropDown"))
{
var inputs = div.getElementsByTagName("input");
if (inputs && inputs.length == 2)
{
{
Translate(inputs[1].value);
}
}
}
}
}
Các Dịch chức năng mất như tham số được lựa chọn ngôn ngữ tùy chọn trong điều khiển thả xuống và thực hiện cuộc gọi không đồng bộ như được hiển thị bên dưới.
function Translate(lang)
{
var request = null;
if (window.XMLHttpRequest)
{
request = new XMLHttpRequest();
if (request.overrideMimeType)
{
request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject)
{
request = new ActiveXObject("Msxml2.XMLHTTP");
}
if (request == null)
{
return;
}
var url = "GetLoginTranslations.aspx";
request.open('GET', url +'?lang=' + lang, true);
request.setRequestHeader("Cache-Control", "no-cache");
request.setRequestHeader("Pragma", "no-cache");
request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
request.onreadystatechange = function() { TranslateLabels(request); };
request.send(null);
}
chức năng Dịch ở trên thực hiện cuộc gọi và nhận kết quả trong trang .aspx được chỉ định (trong trường hợp này là "GetLoginTranslations.aspx ")
khi yêu cầu được hoàn thành và request.onreadystatechange được thiết lập để các TranslateLabels chức năng chức năng này sẽ được thực thi.
trên đường này postback không được thực hiện như trước đây trong trường hợp OnSelectedIndexChanged của DropDownList . kiểm soát
các TranslateLabels chức năng sẽ giống như thế:
function TranslateLabels(request)
{
if (request.readyState == 4)
{
if (request.status == 200)
{
if (request.responseXML)
{
var objRoot = request.responseXML.documentElement;
if (objRoot)
{
if (objRoot.nodeName == "strings")
{
for (var i = 0; i < objRoot.childNodes.length; i++)
{
var node = objRoot.childNodes[i];
var elem;
switch (node.getAttribute("id"))
{
case "lbl_login":
elem = document.getElementById("lbl_login");
if (elem)
elem.innerHTML = node.firstChild.nodeValue;
break;
}
///....
}
}
}
}
}
}
các request.responseXML chứa XML được xây dựng trong trang GetLoginTranslations.aspx và cấu trúc của XML này được định nghĩa ở đó.
sự kiện Page_Load() trong GetLoginTranslations.aspx nên hình như:
protected void Page_Load(object sender, EventArgs e)
{
if (Request["lang"] != null)
strLang = Request["lang"];
//init response
Response.Clear();
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetValidUntilExpires(true);
Response.ContentType = "application/xml";
Response.Charset = "utf-8";
XmlTextWriter xml = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.UTF8)
{
Formatting = Formatting.None
};
xml.WriteStartDocument();
xml.WriteStartElement("strings");
xml.WriteStartElement("string");
xml.WriteAttributeString("id", "lbl_login");
xml.WriteString(GetTranslation("label_login", strLang));
xml.WriteEndElement();
// ... the other labels
xml.WriteEndElement(); //</strings>
xml.Close();
}
Một số cân nhắc khác:
- thiết lập AutoPostBack tài sản của DropDownList false.
Có bài viết về cách giải quyết này một cách an toàn hơn (nếu không nói là hoàn hảo) tại http://www.codeproject.com/Articles/18927/How-to-safely-keep-a-password- trường-trong-postbac – Mark