您的位置:首页 > 移动开发 > 微信开发

微信扫码登陆整合shiro 跨域ajax对cookie处理

2017-10-20 16:40 337 查看

管理端登录业务逻辑

服务器提供非授权接口获取appid、redirectUrl参数

前端通过引用js文件,加载页面时生成微信二维码

window.onload = (function wxLogin(){
var obj = new WxLogin
({
id:"login_container",//div的id
appid: "appid",
scope: "snsapi_login",//写死
redirect_uri:encodeURI(redirectUrl) ,
state: "",
style: "black",//二维码黑白风格
href: "https://某个域名下的css文件"
});
})


服务器端处理微信回调请求,处理code,根据code获取accesstoken,获取用户信息。

StringBuilder url = new StringBuilder();
url.append("https://api.weixin.qq.com/sns/oauth2/access_token?");
url.append("appid=").append(appid);
url.append("&secret=").append(secret);
url.append("&code=").append(code);
url.append("&grant_type=authorization_code");

// 获取accessToken
String token = HttpUtils.doGet(url.toString());
JSONObject json = JSONObject.parseObject(token);

// 获取管理员的用户
String getUserUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + json.get("access_token")
+ "&openid=" + json.get("openid") + "";

String userStr = HttpUtils.doGet(getUserUrl);


处理微信返回的用户信息,服务器生成加密token与redis中的用户数据相关联,将此token存储在cookie之中。

Cookie cookie_com = new Cookie("user-:", token);
cookie_com.setPath("/");
if (cookieAge != -1) {
cookie_com.setMaxAge(cookieAge);
}
cookie_com.setDomain("test.com");
response.addCookie(cookie_com);


拿到用户信息与管理员列表进行对比,如果发现拥有绑定微信的管理员则登陆。

微信扫码过后会有cookie保留期,如果想退出登录需要手动点击退出登录处理登录信息。

shiro对登陆信息的处理会通过从JSESSIONID获取用户信息和判断是否登陆,然而这个JSESSIONID保存在cookie之中,所以如果在跨域的情况下想保持登陆状态,需要进行ajax请求时的cookie传递操作

原生ajax对cookie的处理:
xhr.withCredentials = true;
jquery:
$.ajax({
url: a_cross_domain_url,
// 将XHR对象的withCredentials设为true
xhrFields:{
withCredentials:true
}});


同时服务器端需要对访问的origin进行同意处理

response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
response.setHeader("Access-Control-Allow-Credentials", "true");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息