真的太天真,接触MUI一个星期,问题真层出不穷,一度考虑换一个移动框架,但暂时没有找到一个前端框架,文档里面包括对手势事件处理,上拉刷新等封装处理操作,加上应用程序和WAP的混合开发的巨大的魅力,还是硬着头皮继续开发下去
第一个问题:设置登陆身份认证的cookie的失败
发送第一个登陆AJAX请求:设置coolkie,一开始设置无效,实际上设置成功,前端调试发现没问题,发现了这个会议
DateTime dt = DateTime.Now; dt = DateTime.Now.AddHours(1); string userData = uid; string sql = @"declare @BankSear varchar(30) set @BankSear=(select BankSear from TB_SystemInfo) select a.GUID+'|'+isnull(UserName,'')+'|'+isnull(RealName,'')+'|'+RoleGUId+'|'+isnull(b.ConvertName,'')+'|'+dbo.GetRoleAuthority_UserID(a.GUID)+'|'[email protected]+'|'+a.NetWorkNO+'|'+isnull(UserType,'')+'|'+isnull(c.Name,'')+'|'+isnull(convert(char(1),a.NetworkLevel),'') from Tb_Common_User a left join Bank_Common_Role b on a.RoleGUId=b.OrgGuid and [email protected] left join WFT_Network c on a.NetworkNO=c.NetworkNO where a.GUID='" + uid + "'"; string str = conn.GetScalar(sql); //------------------一般处理程序,没有带过来相关的cookie任何消息,-------------------- //string test = Request["ReturnUrl"]; FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, uid, System.DateTime.Now, dt, true, str, FormsAuthentication.FormsCookiePath); //创建一个验证票据 string cookieStr = FormsAuthentication.Encrypt(ticket); //创建一个cookie,cookie名为web.config设置的名,值为加密后的数据cookieStr, HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieStr); cookie.Expires = ticket.Expiration;//获取cookie过期时间 cookie.Path = FormsAuthentication.FormsCookiePath;//设置cookie保存路径 //cookie.Domain="test.com"; Response.Cookies.Add(cookie);
发送第二个AJAX请求,无论如何饼干里面都是空值,通过上下文中的请求根本无法拿到,换一种方式通过单独设置会议,
应用程序仍然无效,无法使用,甚至需要配置会话运行环境等,回头来看,外网一个静态资源通过AJAX访问ISS服务器资源,怎么可能,通过会话拿到呢,
//判断cookie是否过期 if(Context.User.Identity.Name=="") //if ("admin" == "") { this.Valid=false; } else { //this.Valid=true; //FormsIdentity id = (FormsIdentity)User.Identity; //FormsAuthenticationTicket ticket = id.Ticket; //this.UserID=ticket.UserData; //this.UserName=ticket.Name; //DataTable dt = conn.GetDataTable("select UserID,RealName,RegionID,a.RoleID from Tb_Common_User a left join Tb_Common_Role b on a.RoleID=b.RoleID where UserID=" + this.UserID); //if (dt.Rows.Count>0) //{ // this.RealName=dt.Rows[0]["RealName"].ToString(); // this.RegionID=dt.Rows[0]["RegionID"].ToString(); // this.RoleID = dt.Rows[0]["RoleID"].ToString(); // this.RegionName=getRegionName(dt.Rows[0]["RegionID"].ToString()); // this.RoleName=getRoleName(dt.Rows[0]["RoleID"].ToString()); // this.Authority=GetAuthority(dt.Rows[0]["RoleID"].ToString()); //} this.Valid = true; FormsIdentity id = (FormsIdentity)User.Identity; FormsAuthenticationTicket ticket = id.Ticket; // string vifcode = Context.Request.Cookies["VifCode"].Value; string[] arr = ticket.UserData.Split('|'); if (arr.Length == 11) { this.UserID = arr[0]; this.UserName = arr[1]; this.RealName = arr[2]; this.RoleID = arr[3]; this.RoleName = arr[4]; this.Authority = arr[5]; this.BankSear = arr[6]; this.NetWorkNO = arr[7]; this.UserType = arr[8]; this.NetWorkNOName = arr[9]; this.NetWorkLevel = int.Parse(arr[10]); } }
本地hbuilder内置服务器里面页面算做外网,访问Vs的的编译器下面一般处理程序,设置身份验证的cookie的成功后,
另外发送一个AJAX请求,竟然始终取不到的饼干里面的值,
由于公司后台采用.NET,很自然是用一般处理程序处理AJAX发送的请求,但是由于外网静态资源,请求一般处理程序,
无论会议上,还是应用对象,都无法解决这个问题,非常复杂的问题,困扰整整一个晚上,查阅了大量资料,
但大多非常复杂,比如数据库存储会话ID等等,
结论:本质是跨域问题引起的,无法将存储在浏览器端的的sessionid带过来,调试得知看得很清楚,每一次发送AJAX请求,服务器都重新创建一个新的会话ID,为了解决这个问题,前端发送AJAX请求,需要添加一个参数:
$.ajax(website+'MobileService/System_.ashx?method=xxx, { dataType: "text", type: 'post', //HTTP请求类型 data:{ test:'test' }, async: true, //xhrFields: { // withCredentials: true, }
汗颜:使用AJAX很多次,还真的第一次知道这个参数,就是将该相关的会话ID带给服务器
啰嗦一句:非常重要的一点是,设置了一个全局变量的网站,测试时发生了一件有趣的事情,
AJAX写的URL地址时:假如给的地址包含HTTP,那么发送的地址,不会包括当前的阿贾克斯所在页面的拼接的路径,
否则默认带上这个地址,以为客户将来使用,是要在内网服务器上使用,因而需要单独一个变量,指明要连接数据资源服务器的IP或网站地址:网站
第二个问题:
前端里面的经典跨域问题,
public void ProcessRequest(HttpContext context) { context.Response.Buffer = true; context.Response.ExpiresAbsolute = DateTime.Now.AddDays(-1); context.Response.AddHeader("pragma", "no-cache"); context.Response.AddHeader("cache-control", ""); context.Response.CacheControl = "no-cache"; context.Response.ContentType = "text/plain"; #region 设置允许跨域,允许复杂请求 //header("Access-Control-Allow-Origin: *"); # 跨域处理 context.Response.AddHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8020"); context.Response.AddHeader("Access-Control-Allow-Credentials", "true"); if (context.Request.HttpMethod == "OPTIONS") { context.Response.AddHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH,OPTIONS"); context.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization"); //相当于跨域,因而认为每次都是一个新请求,不保存刚才ajax请求传递过来的sessionid //header('Access-Control-Allow-Headers:x-requested-with'); //header("Access-Control-Allow-Origin:http://dev.roboming.com"); //header('Access-Control-Allow-Credentials:true'); //header('Access-Control-Allow-Methods:GET, POST, OPTIONS');//php设置 //response.addHeader("Access-Control-Allow-Origin", "*");//java设置 context.Response.AddHeader("Access-Control-Allow-Headers", "x-requested-with"); //HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); //context.Response.End(); } #endregion
标题(“访问控制允许来源:*”); #跨域处理
带有*即是为所有的外网,开放访问权限,非常不安全,同时,通过hbuilder调试,发现这样做仍然不行,几乎放弃了,继续翻阅资料,信息,得到灵感,将*换成hbuilder地址如下,再进行访问,问题终于得到解决
context.Response.AddHeader(“访问控制允许来源”,“http://127.0.0.1:8020”);
context.Response.AddHeader(“访问控制允许报头”,“X-请求-与”);
这一行是根据调试控制台,加上的一句话,
补充一点细节:假如请求仍然无效,外网访问仍然显示是没有设置访问控制允许来源,请设置iss网站http响应头
并且以下两个成对设置,否则仍然前端仍然报错
第三个问题:APP和Wap并不是一回事儿,加并不能运行在手机站上,简单说希望混合编程,兼容通用,
风风火火将MUI框架登录模版改动改动,打算登录,一个严重的问题是,点击登录没有反应,一点儿反应都没有,
一个巧合的地方,在于一个类似跳转的功能,点击申请有反应,开始思考究竟什么原因,点击登录为什么没有反应,
终于明白是加缘故,其实调用再加上之前,控制台说的非常清楚,再加上只是运行在应用上,
解决办法:暂时没有办法,自己写登录,第三方登录东东,以后再慢慢解决
注释掉:plusReady
// $.plusReady(function() { // var settingPage = $.preload({ // "id": 'setting', // "url": 'setting.html' // }); // //设置 // var settingButton = doc.getElementById('setting'); // //settingButton.style.display = settings.autoLogin ? 'block' : 'none'; // settingButton.addEventListener('tap', function(event) { // $.openWindow({ // id: 'setting', // show: { // aniShow: 'pop-in' // }, // styles: { // popGesture: 'hide' // }, // waiting: { // autoShow: false // } // }); // }); // //-- // $.oldBack = mui.back; // var backButtonPress = 0; // $.back = function(event) { // backButtonPress++; // if (backButtonPress > 1) { // plus.runtime.quit(); // } else { // plus.nativeUI.toast('再按一次退出应用'); // } // setTimeout(function() { // backButtonPress = 0; // }, 1000); // return false; // }; // });
第四个问题:MUI原生底部切换功能,在真机无法正常使用,实际测试打包成APK,安装也无法使用了,
本以为以上问题,该回避的回避,该解决解决了,没想到根本不算完,这个怎么解决,查了下,有人说是的确有问题,
怎么办?请待下回继续
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助〜如果有疑问大家可以留言交流,谢谢大家对我的支持!