mui的使用--登录,发送ajax,跨域,cookie设置验证失效,及$.plusReady等问题与解决,(二)

真的太天真,接触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,安装也无法使用了,

本以为以上问题,该回避的回避,该解决解决了,没想到根本不算完,这个怎么解决,查了下,有人说是的确有问题,

怎么办?请待下回继续

 

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助〜如果有疑问大家可以留言交流,谢谢大家对我的支持!