您的位置:首页 > 产品设计 > UI/UE

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

2018-10-19 16:08 656 查看

真的太天真,接触MUI一个星期,问题真层出不穷,一度考虑换一个移动框架,但暂时没有找到一个前端框架,文档里面包括对手势事件处理,上拉刷新等封装处理操作,加上应用程序和WAP的混合开发的巨大的魅力,还是硬着头皮继续开发下去

第一个问题:设置登陆身份认证的cookie的失败

发送第一个登陆AJAX请求:设置coolkie,一开始设置无效,实际上设置成功,前端调试发现没问题,发现了这个会议

[code]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)+'|'+@BankSear+'|'+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 b.BankSear=@BankSear 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服务器资源,怎么可能,通过会话拿到呢,

[code]//判断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请求,需要添加一个参数:

[code] $.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或网站地址:网站

第二个问题:

前端里面的经典跨域问题,

[code]  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 

[code]//				$.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,安装也无法使用了,

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

怎么办?请待下回继续

 

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: