随笔——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--------------------------------------------------
终
随笔——mvc公众号自动登录跳转到原页面的方法的更多相关文章
- Chrome插件:微信公众号自动登录(chrome.extension)
manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...
- 【tp5.1】微信公众号授权登录及获取信息录入数据库
微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...
- 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题
开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...
- Struts2通过自己定义拦截器实现登录之后跳转到原页面
这个功能对用户体验来说是非常重要的.实现起来事实上非常easy. 拦截器的代码例如以下: package go.derek.advice; import go.derek.entity.User; i ...
- Struts2透过自定义拦截器实现登录之后跳转到原页面
Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...
- 实现微信公众号自动登陆自己的Web App
测试: 基本的思路是通过公众号OAuth API获取用户微信的openid.第一次使用的时候让用户登录,然后在数据库里把openid和自己应用的userid对应起来.以后获得用户的openid之后就可 ...
- 微信公众号授权登录后报redirect_uri参数错误的问题
在进行微信公众号二次开发的时候,需要通过授权码模式来进行微信授权.比如,在进行登录的时候,用户点击了登录按钮,然后弹出一个授权框,用户点击同意后,就可以获取用户的OpenId等信息了.这篇文章主要 ...
- 微信公众号授权登录,提示“redirect_uri 参数错误”
做微信公众号开发授权登录的时候遇到的坑... 后台服务用node,index.js相关代码如下: const oauth = new OAuth(conf.appid, conf.appsecret) ...
- uniapp - 微信公众号授权登录
[缘由] 采用uniapp进行微信小程序和微信公众号双版本开发:考虑到用户唯一性,我们后端确定了以“unionid”.作为唯一标识. 有的小伙伴估计也是刚入这坑,我就简单说一下步骤流程 [摸索] ...
- C#三种模拟自动登录和提交POST信息的实现方法
网页自动登录(提交Post内容)的用途很多,如验证身份.程序升级.网络投票等,以下是用C#实现的方法. 网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以 ...
随机推荐
- winfrom杀死进程及关闭进程
ProcessStartInfo process = new ProcessStartInfo(); process.FileName = AppDomain.CurrentDomain.BaseDi ...
- Traefik 2.0 实现灰度发布
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484478&idx=1&sn=238390dc ...
- Elasticsearch:运用 shard_size 来提高term aggregation的精度
- MySQL之pt-query-digest分析慢查询日志的详情介绍
一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...
- CentOS使用yum方式安装yarn和nodejs
# 使用epel-release.repo源安装的nodejs版本是6.17.1,有些前端项目使用的话会提示版本太低,具体下图 # 命令执行后的详细情况:curl -sL https://rpm.no ...
- GitLab 之 PlantUML 的配置及使用
转载自:https://cloud.tencent.com/developer/article/1010617 1.PlantUML介绍 UML 统一建模语言是一个通用的可视化建模语言,用于对软件进行 ...
- 常量的定义(const和#define)
定义常量的方法 //均要在调用前(区别全局变量!!) 1.使用#define预处理器 2.使用const关键字 1.#define #define 常量名 常量值 //定义形式,常量名不可以是数字开头 ...
- C++ 自学笔记 对象的初始化
数组的初始化: 在 C++中 struct ≈ Class:struct里面可以有函数. 默认构造函数: 没有参数的构造函数就是默认构造函数
- 自学Spring
Spring官网地址https://spring.io/ springManven官网地址:https://mvnrepository.com------------------------ spri ...
- 关于vmware虚拟机的ova/ovf转换成aws上的AMI镜像
很多时候,我们会有这样的需求,需要将DC中vmware虚拟化的服务器,迁移到aws上,我们就得先将vmware虚拟机导出,然后转换 关于vmvare虚拟的导出备份,一般有ova(Open Virtua ...