U.A.js 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. /*
  2. 此函数为ajax区域 要求所有后台请求来自于这里
  3. 应该5秒内返回给用户一个提示信息。涉及到提示信息可以传递时间参数到此ajax,如果5秒未收到结果,则弹出重试的提示。
  4. ajax 跨域有问题 没有到回调里面去
  5. */
  6. /*
  7. 变量命名编写规范:
  8. 变量类型 变量名称
  9. string str
  10. object obj。
  11. Array arr
  12. Element el
  13. bool b
  14. 用户信息 userinfo
  15. 硬盘信息 diskinfo
  16. 好友信息 frindinfo
  17. 群信息 groupinfo
  18. 回调callback cb
  19. 函数 fun
  20. 错误 err
  21. 参数数组aruguments arg
  22. */
  23. //补充错误的定义。
  24. //错误状态写在r.request.status里面。如果r.request.status==200,则表示成功。其余状态码表示有错误,如果是我们系统发生错误,统一状态码为500,即r.request.status==500,其他由web服务器自己决定。
  25. //详细错误信息在r.value里面.
  26. Namespace.register("U.A");
  27. //#region
  28. //所有请求的ajax对象.
  29. U.A.ASet = [];
  30. //数据库访问地址
  31. U.A.DataBase = {
  32. Reply: ["Mysql", "UseStudio_Reply"], //回复系统
  33. Money: ["Mysql", "UseStudio_Pay"], //交易系统
  34. Develop: ["Mysql", "UseStudio_Develop"] //在线编程平台
  35. };
  36. //云端访问地址
  37. U.A.backAddress = {
  38. //前端系统统一处理
  39. UseStudioManage: "http://main.1473.cn/Uses.ashx", //main
  40. UseStudioDisk: "http://main.1473.cn/Uses.ashx", //disk
  41. pb: "http://main.1473.cn/Uses.ashx", //学习系统
  42. Blog: "http://main.1473.cn/Uses.ashx", //blog
  43. Application: "http://main.1473.cn/Uses.ashx", //站外应用
  44. ABlog: "http://main.1473.cn/admin.ashx", //admin blog
  45. APB: "http://main.1473.cn/admin.ashx", //admin pb
  46. AUser: "http://main.1473.cn/admin.ashx", //admin user
  47. ADisk: "http://main.1473.cn/admin.ashx", //admindisk
  48. AApp: "http://main.1473.cn/admin.ashx", //application
  49. Verify: "http://admin.1473.cn/Verify", //admin 虚拟币
  50. Upload: "http://main.1473.cn/USupfile.ashx", //上传
  51. //后端系统处理
  52. Admin: "http://admin.1473.cn/Admin/Admin.ashx", //admin 自带后台
  53. KF: "http://admin.1473.cn/Admin/Admin.ashx", //admin 统计
  54. office: "http://office.1473.cn/Officetohtml.ashx", //office
  55. UseStudioPay: "http://pay.1473.cn/UseStudioPay.ashx", //交易
  56. Reply: "http://reply.1473.cn" //回复
  57. }
  58. //U.A.backAddress = {
  59. // office: "http://main.1473.cn/Mian.ashx", //office
  60. // Upload: "http://disk.1473.cn/USupfile.ashx", //上传
  61. // UseStudioManage: "http://main.1473.cn/Uses.ashx", //main
  62. // UseStudioDisk: "http://main.1473.cn/Uses.ashx", //disk
  63. // pb: "http://main.1473.cn/Uses.ashx", //学习系统
  64. // Application: "http://app.1473.cn/application.ashx", //站外应用
  65. // Blog: "http://main.1473.cn/Uses.ashx", //blog
  66. // UseStudioPay: "http://pay.1473.cn/UseStudioPay.ashx", //交易
  67. // Reply: "http://reply.1473.cn", //回复
  68. // AApp: "http://admin.1473.cn/Application/AApp.ashx", //application
  69. // ABlog: "http://admin.1473.cn/APB/APB.ashx", //admin blog
  70. // APB: "http://admin.1473.cn/APB/APB.ashx", //admin pb
  71. // AUser: "http://admin.1473.cn/User/Users.ashx", //admin user
  72. // Verify: "http://admin.1473.cn/Verify", //admin 虚拟币
  73. // Admin: "http://admin.1473.cn/Admin/Admin.ashx", //admin 自带后台
  74. // ADisk: "http://admin.1473.cn/Disk/ADisk.ashx", //admindisk
  75. // KF: "http://admin.1473.cn/system/KF.ashx" //admin 统计
  76. //}
  77. //#endregion
  78. /**
  79. * ajax初始化区域
  80. *
  81. * @param {string} 访问的地址
  82. * @param {array} 数据库地址,数据库名,存储过程名,存储过程参数的数组
  83. * @param {function} 回调函数
  84. * @param {array} 函数传参
  85. * @returns {object} ajax对象
  86. -----------这里的传参第一个为loading元素
  87. */
  88. // 删除了一个参数 UCE
  89. U.A.Request = $.ajax = function (str, db, cb) {
  90. //判断浏览器是否在线联网
  91. if (U.M.IsNetwork()) {
  92. var _ajax, //获取所有的传参,参数说明 win 当前域 、 UR ajax原对象 、 EOR 错误回调函数 、 UFN 触发的函数地址 、 UDE 服务器传参 、 UCB 回调函数 UPE 回调参数 、 UAE ajax对象属性 、 UTI当前使用时间
  93. _preAjax = U.A.ASet[U.A.ASet.length - 1]; //ajax对象
  94. //判断ajax的时间差,防止恶意用户用循环向服务器不断发送请求,导致服务器瘫痪。
  95. //恶意请求大于了50次,则判断此用户有恶意攻击嫌疑。
  96. //计算两次ajax请求的时间差
  97. var _ifTimeSpan;
  98. if (_preAjax) {
  99. _ifTimeSpan = new Date().getTime() - _preAjax.date > 50;
  100. }
  101. //如果第一次ajax请求,或者ajax请求小于50次。或者2次发送请求的时间差大于50毫秒,都算没有恶意请求。
  102. if (!_preAjax || _preAjax.timeSpan < 50 || _ifTimeSpan) { //连续发送禁止处理
  103. _ajax = new U.A.Request.init(arguments); //生成ajax对象
  104. //此处添加二级域名跨域,完全跨域,无跨域的分支。
  105. if (_ajax.handleDomain() === true) {
  106. //添加有header和无header的两个分支。
  107. if (_ajax.header) {
  108. return _ajax.createHeader(_ajax.header); //创建连接,添加header的目的是可以自己构建header
  109. } else {
  110. return _ajax.create(); //创建连接,无header分支
  111. }
  112. // return _ajax.create(_ajax.header); //创建连接,添加header的目的是可以自己构建header
  113. }
  114. }
  115. return { "error": "application has been breached" }; //连接过多错误
  116. } else { U.Alert("网络断开!"); }
  117. }
  118. /**
  119. * ajax初始化区域
  120. *
  121. * @param {array} ajax参数
  122. ----------[0] 访问的地址
  123. ----------[1] 服务器传参
  124. ----------[2] 回调函数
  125. ----------[3] 函数传参
  126. -----------这里的传参第一个为loading元素
  127. */
  128. U.A.Request.init = function (arg) { //初始化Ajax对象
  129. /*
  130. 参数说明 win 当前域 、 UR ajax原对象 、 EOR 错误回调函数 、 UFN 触发的函数地址 、 UDE 服务器传参 、 UCB 回调函数
  131. UPE 回调参数 、 UAE ajax对象属性 、 UTI当前使用时间
  132. */
  133. //this.win = window; // win 当前域
  134. //ajax原对象{ TO: _UAE, D: this.UTI, N: this.UFN, J: (_UOE && ((new Date().getTime() - _UOE.D) < 50)) ? _UOE.J + 1 : _UOE ? _UOE.J : 0 }
  135. //U.A.Request调用示例:U.A.Request("http://cd.1473.cn/php", ["mysql.1473.cn", "CloudSqlTestDb", "selectAllData"],function (r){})
  136. U.Ut.AddObj(this, {
  137. win: window, // win 当前域
  138. ajax: null, //ajax原对象{ TO: _UAE, D: this.UTI, N: this.UFN, J: (_UOE && ((new Date().getTime() - _UOE.D) < 50)) ? _UOE.J + 1 : _UOE ? _UOE.J : 0 } 在函数CA里面最后一句话会发送此ajax
  139. err: null, // err error是系统关键字
  140. url: arg[0], // url )。后台地址,形如"http://cd.1473.cn/php"。
  141. //ajax向后台请求的传参,其形式为:["mysql.1473.cn", "CloudSqlTestDb", "selectAllData","guid","str"],包含了数据库地址,数据库名,数据库存储过程名称,数据库参数...如果没有,则新建一个空数组,用法:var e = U.A.Request("http://cd.1473.cn/ss");.则e为后台返回的值。
  142. //UDE改成db
  143. db: arg[1] || [],
  144. cb: arg[2] || "", //回调函数 cb
  145. cbParams: arg[3], //回调参数 cbparams
  146. //调用方法:U.A.Request(US.Auth,"UseStudioManage.AddToLoginLog", [US.userInfo.userid || US.NU, US.NLInfo.LogAddr || "", US.ITID], U.M.apply(), [], { type: "Get", "async": false, "timeout": 1, "CONTENT-TYPE": "application/json" }); //访问日志添加消息
  147. header: arg[4] || "", //暂时没有用处。浏览器升级后对ajax的功能进行扩展,加入了"对head头部自定义修改"的功能。CONTENT-TYPE:application/x-www-form-urlencoded;charset=UTF-8.
  148. UTI: new Date() //ajax生成时间..删除,时间保存在第二个参数ajax里面。
  149. }); //使用参数区域
  150. }
  151. U.A.Request.init.prototype = {
  152. createHeader: function (header) {
  153. var i, _url, _isDomain, _db, _ajax, isAsync, r;
  154. var ajaxType = header.type; //用户请求类型,默认1473全部是post请求。
  155. var _USE = this.toAjaxFormat(); //生成请求参数 数据结构:
  156. _url = _USE[0]; //连接的后台地址 形如"http://cd.1473.cn/php"
  157. _db = _USE[1]; //传参参数;
  158. //如果不传递回调函数,则为同步请求,示例:U.A.Request(US.Auth,"UseStudioManage.AddToLoginLog", [US.userInfo.userid || US.NU, US.NLInfo.LogAddr || "", US.ITID]);。返回json数据,一直等待服务器返回,如果服务器执行1分钟,页面停顿1分钟。
  159. if (U.Ut.isFunction(this.cb)) {
  160. isAsync = true; //函数是否异步
  161. }
  162. //如果请求为get
  163. if (ajaxType.toUpperCase() == "GET") {
  164. _url += "?" + _db;
  165. }
  166. this.ajax = this.CA(_url); //生成ajax对象
  167. _ajax = this.ajax.systemAjax; //获取系统ajax对象
  168. _ajax.open(ajaxType, _url, isAsync); //设置ajax请求方法 url 是否异步
  169. header["CONTENT-TYPE"] = header["CONTENT-TYPE"] || "application/x-www-form-urlencoded;charset=UTF-8"
  170. //设置请求参数
  171. for (i in header) {
  172. if ("type,async".indexOf(i) == -1) {
  173. try {
  174. if (i in _ajax) {
  175. _ajax[i] = header[i];
  176. } else {
  177. _ajax.setRequestHeader(i, header[i]);
  178. } //设置head头部
  179. } catch (e) { }
  180. }
  181. }
  182. // 指定服务器返回数据的MIME类型 firfox设置兼容
  183. if (_ajax.overrideMimeType) {
  184. if (header["responseType"] == "blob") {
  185. _ajax.overrideMimeType("text/plain; charset=x-user-defined");
  186. } else {
  187. _ajax.overrideMimeType("text/html");
  188. }
  189. }
  190. //发送请求
  191. _ajax.send(_db);
  192. //得到服务器返回的值,一般为json,也可能为字符串。如果是异步,则走异步逻辑,否则走同步逻辑
  193. if (isAsync) {
  194. r = this["async"]();
  195. } else {
  196. r = this["sync"]();
  197. }
  198. //返回
  199. return _isDomain;
  200. },
  201. /**
  202. * Ajax对象创建
  203. *
  204. * @param {object} ajax属性
  205. */
  206. create: function () {
  207. var header = {};
  208. var i, _url, _isDomain, _db, _ajax, isAsync, r;
  209. var ajaxType = "POST"; //用户请求类型,默认1473全部是post请求。
  210. var _params = this.toAjaxFormat(); //生成请求参数 数据结构:
  211. _url = _params[0]; //连接的后台地址 形如"http://cd.1473.cn/php"
  212. _db = _params[1]; //传参参数;
  213. //如果不传递回调函数,则为同步请求,示例:U.A.Request(US.Auth,"UseStudioManage.AddToLoginLog", [US.userInfo.userid || US.NU, US.NLInfo.LogAddr || "", US.ITID]);。返回json数据,一直等待服务器返回,如果服务器执行1分钟,页面停顿1分钟。
  214. if (U.Ut.isFunction(this.cb)) {
  215. isAsync = true; //函数是否异步
  216. }
  217. //如果请求为get
  218. if (ajaxType.toUpperCase() == "GET") {
  219. _url += "?" + _db;
  220. }
  221. //设置请求超时时间
  222. if (isAsync) {
  223. // 给header对象添加属性
  224. header.timeout = 90000;
  225. header.ontimeout = function () { this.AE(); }
  226. }
  227. //指定相应的http内容类型
  228. // header["CONTENT-TYPE"] = "application/x-www-form-urlencoded;charset=UTF-8";
  229. this.ajax = this.CA(_url); //生成ajax对象
  230. _ajax = this.ajax.systemAjax; //获取系统ajax对象
  231. _ajax.open(ajaxType, _url, isAsync); //设置ajax请求方法 url 是否异步
  232. // 指定服务器返回数据的MIME类型 firfox设置兼容
  233. _ajax.setRequestHeader("CONTENT-TYPE", "application/x-www-form-urlencoded;charset=UTF-8");
  234. // 指定服务器返回数据的MIME类型 firfox设置兼容
  235. if (_ajax.overrideMimeType) {
  236. _ajax.overrideMimeType("text/html");
  237. }
  238. //发送请求
  239. _ajax.send(_db);
  240. //得到服务器返回的值,一般为json,也可能为字符串。
  241. if (isAsync) {
  242. r = this["async"]();
  243. } else {
  244. r = this["sync"]();
  245. }
  246. //返回
  247. return r;
  248. },
  249. /**
  250. * 根据请求的url判断域名是否存在跨域。三种跨域情况
  251. * @return
  252. */
  253. handleDomain: function () {
  254. //1、二级域名跨域,一般是a.1473.cn访问b.1473.cn。。可能是正常访问,也可能是iframe访问。,
  255. //2、完全跨域。www.a.com访问www.b.com。
  256. //3、没有跨域的情况
  257. var _isDomain, _url, _frame;
  258. var _params = this.toAjaxFormat(); //生成请求参数 数据结构:
  259. _url = _params[0]; //连接的后台地址 形如"http://cd.1473.cn/php"
  260. _isDomain = this.isDomain(_url);
  261. //1473跨域处理,判断是否是1473域,如果不是,则是外域调用
  262. if (_isDomain[0] && !_isDomain[1]) { // 判断是否是1473主域
  263. //如果是1473域的处理
  264. _frame = window.frames; //所有加载的域,对1473域下所有iframe进行循环,目的是找到可跨域的iframe。
  265. for (i = 0; i < _frame.length; i++) {
  266. try {
  267. if (!_url.indexOf(_frame[i].location.protocol + "//" + _frame[i].location.host)) { //找到指定的跨域
  268. return _frame[i].U.A.Request(this.url, this.db, this.cb, this.cbParams, this.header); //跨域获取
  269. }
  270. } catch (e) { }
  271. }
  272. }
  273. //完全跨域判断非1473的域名,
  274. else if (!_isDomain[1] && _url.indexOf("1473.cn") > -1 && $("#U_Domain")[0]) { //其他域名跨域处理
  275. //其他站点,跨域形式访问:例如:http://a.com/ 在页面中调用U.A.Request(US.Auth,"UseStudioManage.AddToLoginLog", [US.userInfo.userid || US.NU, US.NLInfo.LogAddr || "", US.ITID]);
  276. this.goDomain(); //外站跨域调用
  277. return false;
  278. }
  279. return true;
  280. },
  281. //把传参格式转换为Ajax请求格式
  282. // 刑如:US.Auth,"UseStudioManage.AddToLoginLog", [US.userInfo.userid || US.NU, US.NLInfo.LogAddr || "", US.ITID] 转换为下面的格式
  283. // 格式:"http://main.1473.cn/Uses.ashx",US.userInfo.userid || US.NU +"&" + US.NLInfo.LogAddr || ""+ "&" + US.ITID, "http://main.1473.cn/Uses.ashx"(默认请求地址,如果第一个参数不在U.A.backAddress中,则使用第三个)
  284. /*
  285. * @return {array} 域、 加密参数、 默认地址 例:
  286. */
  287. toAjaxFormat: function () {
  288. var _userInfo, _useUrl, _defaultUrl,
  289. _requestObj = U.A.backAddress, //1473请求地址区域
  290. _url = this.url, //这个是请求参数
  291. _params = U.M.SplitArray(this.db.concat()), //参数进行加密
  292. _source = _url.indexOf(":") > -1 && U.M.IsUrl(_url), //判断来源是否是链接
  293. _requestArr = _url.split("."), //这里拆分1473的请求
  294. _reqConfig = U.A.DataBase[_requestArr[0]]; //非主系统的外系统的请求配置
  295. if (_source || _reqConfig) { //非指定云端链接
  296. if (_reqConfig) {
  297. _url = _requestObj[_requestArr[0]];
  298. _params += "&DBTYPE=" + _reqConfig[0] + "&DBNAME=" + _reqConfig[1]; //1473主站点插件区域
  299. }
  300. _useUrl = _url;
  301. _params = "mode=" + _params; //设置传参
  302. }
  303. else if (_requestArr && _requestArr[0] && _requestObj[_requestArr[0]]) { //云端的请求
  304. _defaultUrl = _requestObj[US.Auth, "UseStudioManage"]; //默认地址
  305. _useUrl = _requestObj[_requestArr[0]]; //选择的地址
  306. _params = "functionname=" + _url + "&" + _url + "=" + _params;
  307. }
  308. else {
  309. _useUrl = window.location;
  310. _useUrl = window.location ? _useUrl.protocol + "//" + _useUrl.host + "/" + _url : "./" + _url;
  311. _params = "mode=" + _params;
  312. } //外站请求
  313. //1473传参 + this.LIDZ()
  314. try {
  315. //用户个人信息
  316. if (parent.US) {
  317. //传递用户id,后台安全判断及处理
  318. _userInfo = parent.US.userInfo;
  319. if (_userInfo && _userInfo.UserId) {
  320. _params += "&UserId=" + _userInfo.UserId + "&LoginId=" + _userInfo.LoginId;
  321. }
  322. }
  323. else {
  324. _userInfo = {};
  325. }
  326. }
  327. catch (e) { _userInfo = {}; }
  328. //设置1473项目传参的id
  329. _params += "&PageId=" + US.PageId + "&LoginId=" + US.SystemId;
  330. //请求的地址,参数,请求的后台函数名
  331. return [_useUrl, _params, _defaultUrl];
  332. },
  333. //完全跨域设置(此处非1473域名区域)处理区域
  334. goDomain: function () {
  335. // 获取回调参数
  336. var _loading = this.cbParams ? this.cbParams[0] : null;
  337. // 加载loading
  338. if (_loading) {
  339. U.MD.loading(_loading[0])
  340. } else {
  341. U.MD.loading(_loading, _loading[1])
  342. }
  343. // (_UDE) && (U.MD.loading(_UDE[0] || _UDE, _UDE[1])); //设置loading
  344. // 页面消息传递
  345. U.MN.message({
  346. "obj": "#U_Domain",
  347. "Sender": true, //消息发送
  348. "me": U.M.apply(this, function (_data) { //消息回调
  349. var _USE = _data[2].split("=");
  350. //后台设置了cookie 前台同时响应
  351. if (_USE[1] == "") {
  352. U.M.Cookies.del(_USE[0]);
  353. } else {
  354. U.M.Cookies.set(_data[2]);
  355. }
  356. document.wincookie = _data[2]; //记录cookie
  357. (this.AE) && (this.AE(true, _data[0])); //回调函数
  358. })
  359. }).post([this.url, this.db], "domain"); //跨域传参
  360. },
  361. /**
  362. * 获取链接地址
  363. *
  364. * @param {url} 连接地址
  365. -----------[0] 是否为1473域
  366. -----------[0] 是否为主域
  367. */
  368. isDomain: function (URL) {
  369. var _url;
  370. //用本地html打开网站时,没有window.location。
  371. if (window.location) {
  372. //获取当前域名地址栏,不包含目录结构。例如:
  373. _url = window.location.protocol + "//" + window.location.host; //当前域
  374. if (_url.indexOf("1473.cn") > -1 && URL.indexOf("1473.cn") > 0) {
  375. return [true, !URL.indexOf(_url)];
  376. } else {
  377. return [false, false];
  378. }
  379. // return [(_url.indexOf("1473.cn") > -1 && URL.indexOf("1473.cn") > 0), !URL.indexOf(_url)];
  380. }
  381. // else { return [false, false]; }
  382. },
  383. /**
  384. * 创建Ajax对象
  385. *
  386. * @param {url} 连接地址
  387. * @returns {object} ajax对象
  388. */
  389. CA: function (url) {
  390. var i, _ajax, _xhr, _url, _ajaxObj = U.A.ASet,
  391. _preAjax = _ajaxObj[_ajaxObj.length - 1],
  392. _xhr = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; //ajax对象
  393. // 获取当前域名
  394. if (window.location) {
  395. _thisUrl = window.location.protocol + "//" + window.location.host;
  396. } else {
  397. _thisUrl = "";
  398. }
  399. //获取可以使用的Ajax对象
  400. for (i = 0; i < _ajaxObj.length; i++) { //在ajax里找到使用对象
  401. if ((_ajax = _ajaxObj[i].systemAjax).readyState == 4) {
  402. _ajax.onreadystatechange = U.M.apply(); //设置回调为空
  403. _ajax.abort(); //停止
  404. return _ajaxObj[i];
  405. }
  406. }
  407. //这里创建Ajax对象
  408. try { _ajax = new window.XMLHttpRequest(); } //浏览器默认ajax对象
  409. catch (e) {
  410. for (i = 0; i < _xhr.length; i++) { //ie6-系列使用
  411. try {
  412. _ajax = new ActiveXObject(_xhr[i]);
  413. break;
  414. } catch (e) { }
  415. }
  416. }
  417. //h5创建跨域ajax
  418. if (url.indexOf(_thisUrl) == -1 && window.XDomainRequest) {
  419. _ajax = new window.XDomainRequest();
  420. }
  421. //疑似非法ajax请求次数记录
  422. var timeSpan;
  423. //如果当前发送的ajax请求和上一次发送的ajax请求时间小于0.05秒。则判断为循环非法操作。
  424. if (_preAjax && ((new Date().getTime() - _preAjax.date) < 50)) {
  425. timeSpan = _preAjax.timeSpan + 1; //恶意攻击+1.
  426. } else {
  427. if (_preAjax) {
  428. timeSpan = _preAjax.timeSpan;
  429. } else {
  430. timeSpan = 0;
  431. }
  432. }
  433. //(_preAjax && ((new Date().getTime() - _preAjax.D) < 50)) ? _preAjax.J + 1 : _preAjax ? _preAjax.J : 0;
  434. //生成ajax请求
  435. var ajax = {
  436. systemAjax: _ajax, //系统ajax new window.XMLHttpRequest(); //systemajax
  437. date: this.UTI, //当前时间 new Date(); //date
  438. fun: this.url, //向后台发送请求的函数名称。 //fun
  439. timeSpan: timeSpan //与上一次发送Ajax请求的时间差距。 //timespan
  440. };
  441. _ajaxObj.push(ajax); //把这次的ajax请求记录到数组,目的是方便以后获取查询过的ajax。1、为了找错误,2、为了判断ajax的时间差,防止恶意用户用循环向服务器不断发送请求,导致服务器瘫痪。
  442. //return (_UDE[_UDE.length] = { TO: _UAE, D: this.UTI, N: this.UFN, J: (_UOE && ((new Date().getTime() - _UOE.D) < 50)) ? _UOE.J + 1 : _UOE ? _UOE.J : 0 });
  443. return ajax;
  444. },
  445. //设置异步请求
  446. async: function () {
  447. var _ajax = this.ajax.systemAjax, //ajax对象
  448. _loading = this.cbParams, //回调参数 loading
  449. _isUndefined = U.Ut.isUndefined(_ajax.onload), //判断兼容问题
  450. _cb;
  451. if (_isUndefined) {
  452. _cb = U.M.apply(this, this.AE); //回调函数设置
  453. }
  454. else {
  455. _cb = U.M.apply(this, this.TAC); //回调函数设置
  456. }
  457. // _cb = U.M.apply(this, this[_isUndefined ? "AE" : "TAC"]); //回调函数设置
  458. // 设置loading
  459. if (_loading && _loading[0]) {
  460. if (_loading[0][0]) {
  461. U.MD.loading(_loading[0][0], _loading[0][1]);
  462. } else {
  463. U.MD.loading(_loading[0], _loading[0][1]);
  464. }
  465. }
  466. // (_cbParams && _cbParams[0]) && (U.MD.loading(_cbParams[0][0] || _cbParams[0], _cbParams[0][1]));
  467. //设置错误和异步请求
  468. // 设置ajax回调函数
  469. if (_isUndefined) {
  470. _ajax.onreadystatechange = _cb;
  471. } else {
  472. _ajax.onload = _cb;
  473. }
  474. // 设置ajax错误时的处理
  475. try {
  476. _ajax.onerror = U.M.apply(this, this.OER);
  477. } catch (e) { }
  478. },
  479. //跨域异步使用
  480. TAC: function () {
  481. this.ajax.systemAjax.status = 200; //设置成功状态
  482. this.AE(true); //调用跨域统一处理
  483. },
  484. //错误处理
  485. OER: function () {
  486. this.ajax.systemAjax.status = 500; //设置错误为500
  487. this.AE(true); //错误处理
  488. },
  489. /**
  490. * 服务器异步加载成功后,得到返回值,取消loading,然后回调.
  491. *
  492. * @param {boolean} 是否可以直接通过 不进行ajax流程判断
  493. * @param {string} 绕过ajax流程 传参
  494. */
  495. AE: function (UTF, UST) {
  496. try {
  497. if (UTF === true || this.ajax.systemAjax.readyState == 4) { //已经加载成功
  498. (this.ajax) && (this.ajax.timeSpan = 0);
  499. var _loading = this.cbParams, //loading 元素
  500. _data = this.sync(UST), //ajax string 数据 生成 json数据集
  501. _timeSpan = (new Date()).getTime() - this.UTI.getTime(); //ajax总共耗时
  502. // 取消loading
  503. if (_loading && _loading[0]) {
  504. if (_loading[0][0]) {
  505. U.MD.uploading(_loading[0][0]);
  506. } else {
  507. U.MD.uploading(_loading[0]);
  508. }
  509. }
  510. // (_UPE && _UPE[0]) && (U.MD.uploading(_UPE[0][0] || _UPE[0])); //取消loading
  511. //访问时间太长或者出现了错误 输出控制台
  512. if (_timeSpan > 1000 || _data.error) {
  513. (U.M.Console({ "T": _timeSpan, "N": this.url, "V": _data.error }));
  514. }
  515. // (_timeSpan > 1000 || _data.error) && (U.M.Console({ "T": _timeSpan, "N": this.url, "V": _data.error })); //访问时间太长或者出现了错误 输出控制台
  516. //关闭连接
  517. if (_data.httpRequest.abort) {
  518. _data.httpRequest.abort();
  519. }
  520. // (_data.r.abort) && (_data.r.abort()); //关闭连接
  521. //回调数据
  522. if (this.cb && _data.value !== null) {
  523. this.cb.call(this.win, _data)
  524. }
  525. // (this.cb && _data.value !== null) && (this.cb.call(this.win, _data)); //回调数据
  526. }
  527. } catch (e) { U.M.Console(e); }
  528. },
  529. /**
  530. * 生成数据
  531. *
  532. * @param {string} 绕过ajax流程 传参
  533. * @return {string} 数据参数
  534. */
  535. sync: function (data) {
  536. var _UTF, _ajax;
  537. //获取ajajx对象
  538. if (this.ajax) {
  539. _ajax = this.ajax.systemAjax;
  540. }
  541. else {
  542. _ajax = {};
  543. }
  544. // _URE = this.ajax ? this.ajax.systemAjax : {}, //获取ajajx对象
  545. var _ajaxAttr = { httpRequest: _ajax, status: null, value: null, context: this.cbParams }, //ajax对象使用
  546. _errorFun = U.A.Error(); //ajax错误处理
  547. //没有值 直接设置报错
  548. // if (!_ajaxAttr.httpRequest) {
  549. // _ajaxAttr.httpRequest = { status: "504", statusText: "Gateway timeout" };
  550. // }
  551. // (!_ajaxAttr.r) && (_ajaxAttr.r = { status: "504", statusText: "Gateway timeout" }); //没有值 直接设置报错
  552. _ajaxAttr.value = data; //设置值
  553. //请求成功处理
  554. if (_ajax.status == 200) {
  555. _ajaxAttr.value = this.getBackStrToJson(); //生成返回的参数
  556. _UTF = _errorFun.isError(_ajaxAttr.value);
  557. if (_UTF) {
  558. _errorFun.set(_ajaxAttr.value);
  559. }
  560. }
  561. //错误处理.
  562. else {
  563. _ajaxAttr.status = {
  564. "status": _ajax.status,
  565. "statusText": _ajax.statusText
  566. };
  567. }
  568. // if (_ajaxAttr.error && this.err) {
  569. // this.err()
  570. // } else if (_UTF && this.err) {
  571. // this.err()
  572. // }
  573. // ((_ajaxAttr.error || _UTF) && this.err) && (this.err());
  574. return _ajaxAttr; //生成数据返回
  575. },
  576. /**
  577. * 得到后台返回的字符串,再把后台返回的字符串生成一个json对象
  578. *
  579. * @return {object} json值
  580. */
  581. getBackStrToJson: function () {
  582. var _ajax = this.ajax.systemAjax, //ajax对象
  583. _resXml = _ajax.responseXML; //xml对象
  584. //如果服务器返回的为xml对象
  585. if (_resXml) {
  586. _resXml = _resXml.xml
  587. }
  588. // (_resXml) && (_resXml = _resXml.xml); //如果服务器返回的为xml对象
  589. if (!_resXml) {
  590. _resXml = _ajax.responseText; //返回的值
  591. _resXml = U.M.toList(_resXml); //生成对象
  592. }
  593. return _resXml;
  594. }
  595. }
  596. //#endregion
  597. //#region jsonp跨域获取数据,1473的项目跨域到百度,只能通过js方式进行跨域。js引用百度的一个js,百度返回一个值。就可以跨域了。
  598. /**
  599. * jsonp跨域获取数据初始化
  600. *
  601. * @param {object} jsonp参数
  602. ----------[call] 回调函数
  603. ----------[parameter] 回调参数
  604. * @return {string} jsonp类对象
  605. */
  606. U.A.Jsonp = $.Jsonp = function (UDE) {
  607. var _UTE = new U.A.Jsonp.init(UDE); //初始化jsonp类
  608. _UTE.send(); //发送请求
  609. return _UTE;
  610. }
  611. /**
  612. * jsonp初始化对象
  613. *
  614. * @param {object} jsonp参数
  615. ----------[call] 回调函数
  616. ----------[parameter] 回调参数
  617. */
  618. U.A.Jsonp.init = function (UDE) { //初始化Jsonp对象
  619. U.Ut.AddObj(this, UDE);
  620. }
  621. U.A.Jsonp.init.prototype = {
  622. /**
  623. * jsonp发送请求数据
  624. *
  625. */
  626. send: function () {
  627. var _URL = this.url, //发送的地址
  628. _UCE = this.call, //发送的回调函数
  629. _UPE = this.parameter, //发送的参数
  630. UDID = U.M.getFun(U.M.apply(this, this.success)).id; //设置委托状态 等待回调
  631. this.UFE = U.MD.DynamicLoad(_URL + (_UCE ? "?callback=" + _UDID + "&" : "") + (_UPE ? "parameter=" + U.M.SplitArray(_UPE) : ""), "js", U.M.apply(this, this.Asyn), null, true); //请求数据等待回调
  632. },
  633. //异步加载成功
  634. Asyn: function () { },
  635. /**
  636. * jsonp异步回调
  637. *
  638. */
  639. success: function (r) {
  640. (this.call) && (this.call(r)); //执行回调函数
  641. $(this.UFE).remove(); //删除遗留的jsonp数据文件
  642. }
  643. }
  644. //#endregion
  645. //#region ajax post请求
  646. /**
  647. * post请求
  648. * @param {object} 传参
  649. ----------[url] 请求的地址
  650. ----------[parameter] 请求的参数
  651. ----------[context] 请求的回调参数
  652. ----------[cb] 回调函数
  653. * @return {object} post对象
  654. */
  655. U.A.Post = $.Post = function (UDE) {
  656. var _UTE = new U.A.Post.init(UDE); //初始化对象
  657. _UTE.send(); //发送请求
  658. return _UTE;
  659. }
  660. /**
  661. * 初始化post对象
  662. *
  663. */
  664. U.A.Post.init = function (UDE) {
  665. U.Ut.AddObj(this, UDE);
  666. }
  667. U.A.Post.init.prototype = {
  668. //发送请求
  669. send: function () {
  670. var i, _UDE = [],
  671. _URL = this.url, //请求的地址
  672. _UPE = this.parameter, //请求参数
  673. _UCE = this.context; //请求传参
  674. //添加参数
  675. if (_UPE) {
  676. for (i in _UPE) {
  677. if (_UPE.hasOwnProperty(i)) {
  678. _UDE.push($$("input", { "name": i, "value": _UPE[i] }));
  679. }
  680. }
  681. }
  682. //发送消息
  683. U.UP.uploading(_UDE, U.M.apply(this, this.success), _UCE, _URL, null, "application/x-www-form-urlencoded");
  684. },
  685. /**
  686. * psot请求成功回调
  687. * @param {object} 数据
  688. */
  689. success: function (UDE) { //异步回调
  690. (this.cb) && (this.cb(UDE));
  691. }
  692. }
  693. //#endregion
  694. //#endregion
  695. //#region 错误区域,需要在界面中显示,如何显示,先设计,后制作功能。然后重写一个函数,不需要类。
  696. //错误区域初始化
  697. U.A.Error = function () {
  698. return new U.A.Error.init();
  699. }
  700. //生成错误对象 错误对象的实例
  701. U.A.Error.init = function () {
  702. this.State = this.LogID = this.Value = this.Dt = this.Type = null;
  703. }
  704. U.A.Error.init.prototype = {
  705. /**
  706. * 判断对象是否为错误对象
  707. *
  708. * @return {object} json值
  709. */
  710. isError: function (UDE) {
  711. if (U.Ut.isObject(UDE)) { //判断是否为对象
  712. for (var i in this) { if (this.hasOwnProperty(i) && !(i in UDE)) { return false; } }
  713. return true;
  714. }
  715. return false;
  716. },
  717. /**
  718. * 设置错误
  719. *
  720. * @return {object} 错误值
  721. */
  722. set: function (UDE) {
  723. U.Ut.AddObj(this, UDE); //根据错误值添加错误
  724. return this;
  725. }
  726. }
  727. //#endregion