情境:同一 IIS 部署訂單系統與 OA 系統 (不同虛擬目錄),共用資料庫,需單一帳號登入其中一系統後自動登入另一系統,不使用 WCF/WebService。
$.ajax({
type: "GET",
url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd),
dataType: "jsonp",
jsonp: 'callback',
success: function (result) { /* 處理結果 */ }
});
public class JsonpResult<T> : ActionResult {
public T Obj { get; set; }
public string CallbackName { get; set; }
public JsonpResult(T obj, string callback) { Obj = obj; CallbackName = callback; }
public override void ExecuteResult(ControllerContext context) {
var js = new JavaScriptSerializer();
var jsonp = CallbackName + "(" + js.Serialize(Obj) + ")";
context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.Write(jsonp);
}
}
public ActionResult AppLogOn(string UserName, string PassWord, string callback) {
// 驗證帳號密碼...
return new JsonpResult<object>(new { success = true, rankName = rankName }, callback);
}
原理:JSONP 透過 callback 參數傳遞前端函數名,伺服器回傳 callbackName(jsonData) 字串,瀏覽器執行該函數實現跨域資料傳遞。需注意安全風險,避免濫用。