随笔——mvc公众号自动登录跳转到原页面的方法
页面路径传参跳到那带到哪
1、全局过滤(继承过滤也行)。这里使用的全局过滤
2、过滤判断需要登录的话,获取本次路径传到登录的页面
3、登录的页面判断是微信浏览器的话,参数带到微信登录接口
4、微信登录接口处理后的返回Handle方法不就得到了原页面的URL
上代码
----------------------------------------------------------------------全局过滤begin--------------------------------------------------
protected void Application_Start() { //在applicationstart注册过滤类 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); / /application_start在Global.asax里面。这个知道吧。 } //过滤类有很多全局过滤 public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //在FilterConfig中注册全局异常过滤类 filters.Add(new ExceptionFilter()); //在FilterConfig中注册全局HTTP过滤类 加粗标红,要考的 filters.Add(new SupportFilterAttribute()); } }
public class SupportFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { string ctlName = filterContext.Controller.ToString(); string[] routeInfo = ctlName.Split('.'); string controller = null; int ctlIndex = Array.IndexOf(routeInfo, "Controllers"); controller = routeInfo[ctlIndex].Replace("Controller", "").ToLower(); if (controller != "login") { if (filterContext.HttpContext.Session["Account"] == null) { //获取当前url string _url = HttpContext.Current.Request.Url.ToString().ToLower(); //重定向到登录 filterContext.HttpContext.Response.Redirect("/Login/Index?oldurl=" + _url); } } } }
----------------------------------------------------------------------全局过滤end--------------------------------------------------
----------------------------------------------------------------------Login页面begin--------------------------------------------------
<script> $(function () { //看吧,这里获取到原来的路径 var _oldurl = request("oldurl"); if (_auto != "false") { if (wx_or_browser() == 1) { layui.use(['layer'], function () { var $ = layui.$; layer.msg('登录中...', { icon: 16 , shade: 0.01 }); }); //是微信浏览器打开的页面。跳转到自动登录 window.location.href = "/Login/WxWebLogin?oldurl=" + _oldurl; } } }) </script> //下面是封装的js方法 <script> //获取前台传值 function request(strParame) { var args = new Object(); var query = location.search.substring(1); var pairs = query.split("&"); // Break at ampersand for (var i = 0; i < pairs.length; i++) { var pos = pairs[i].indexOf('='); if (pos == -1) continue; var argname = pairs[i].substring(0, pos); var value = pairs[i].substring(pos + 1); value = decodeURIComponent(value); args[argname] = value; } return args[strParame]; } //判断微信浏览器还是别的浏览器 微信浏览器返回1,其他返回2 function wx_or_browser() { var ua = navigator.userAgent.toLowerCase(); var isWeixin = ua.indexOf('micromessenger') != -1; if (isWeixin) {//是在微信中打开的 return 1; } else { return 2; } } </script>
----------------------------------------------------------------------Login页面end--------------------------------------------------
----------------------------------------------------------------------微信公众号自动登录begin--------------------------------------------------
//微信浏览器打开的时候,转到这个页面 public ActionResult WxWebLogin() { //获取当前域名 string domainName = ConfigurationManager.AppSettings["DomainName"].ToString(); //原页面继续传输 string sysurl = Request.QueryString["oldurl"]; string redirect_uri = string.Format("http://{0}/Login/WxWebLoginHandle?oldurl={1}", domainName, sysurl); string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=snsapi_userinfo_ok#wechat_redirect", WXmodel.appid, redirect_uri); Response.Redirect(url); return View(); } //公众号获取权限信息后跳转到这里,WxWebLogin方法设置的 public ActionResult WxWebLoginHandle() { try { if (HttpContext.Request.QueryString["state"] != null) { string state = HttpContext.Request.QueryString["state"].ToString(); string code = HttpContext.Request.QueryString["code"].ToString(); //取出原页面地址 string oldurl = HttpContext.Request.QueryString["oldurl"].ToString(); //获取网页token //获取webtoken WxBegin.GetWebToken(code, ref postString); //拉取用户信息 string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", WXmodel.web_access_token, WXmodel.web_openid); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "GET"; HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); Stream stream = resp.GetResponseStream(); string result = ""; //获取内容 using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { result = reader.ReadToEnd(); } string errcode = JSCommon.GetJsonValue(result, "errcode"); if (string.IsNullOrEmpty(errcode)) { WXUserInfo wxU = JsonHandler.Deserialize<WXUserInfo>(result); int i = new Apps.BLL.PhoneLoginBLL().CreateUser(wxU, ref postString); if (i > 0) { tb_User user = new Apps.BLL.PhoneLoginBLL().GetUser(wxU.openid); //自动登录 postString += "\r\nuser:" + user.openId; AccountModel account = new AccountModel(); account.Id = user.guid; account.Photo = user.headimgurl; account.UserName = user.userName; account.LoginSource = "gzh-auto"; account.OpenId = user.openId; account.UserType = user.uType; Session["Account"] = account; postString += "\r\nsessionid:" + Session.SessionID; LoginUserManage.Add(Session.SessionID, account.Id); //检查是否有快捷跳转的 if (!string.IsNullOrEmpty(oldurl)) { Response.Redirect(oldurl); } else { if (user.uType == 1) { //用户首页 Response.Redirect("/home/index"); } else { //别的首页 Response.Redirect("/enjoy/index"); } } } else { return Content(@"<script >alert('用户信息拉取失败,正跳转手动登录'); setTimeout(function(){ window.location.href='/Login/index?auto=false'; },300) </script >"); } } else { string a = WxError.WxErrorHadle(result); if (!string.IsNullOrEmpty(a)) { throw new Exception(a); } } } } catch (Exception) { throw; } return Content(""); }
----------------------------------------------------------------------微信公众号自动登录end--------------------------------------------------
终