zoukankan      html  css  js  c++  java
  • 随笔——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 += "
    user:" + 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 += "
    sessionid:" + 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--------------------------------------------------

  • 相关阅读:
    docker搭建ros-indigo-arm交叉编译环境
    ROS系统C++代码测试之gtest
    ROS系统python代码测试之rostest
    ROS(Robot Operating System)常用环境变量介绍
    【持续更新】 | OpenCV 学习笔记
    Mac + PyCharm 安装 Opencv3 + python2.7
    如何用Caffe训练自己的网络-探索与试验
    九度OJ-第5章-图论
    看周志华教授的一番话有感
    姿势估计实验-Realtime_Multi-Person_Pose_Estimation-CMU
  • 原文地址:https://www.cnblogs.com/bklsj/p/13858537.html
Copyright © 2011-2022 走看看