分享

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

 Bladexu的文库 2018-09-07

管理端登录业务逻辑

  • 服务器提供非授权接口获取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文件"
        });
    })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 服务器端处理微信回调请求,处理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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 处理微信返回的用户信息,服务器生成加密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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 拿到用户信息与管理员列表进行对比,如果发现拥有绑定微信的管理员则登陆。
  • 微信扫码过后会有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
   }});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 同时服务器端需要对访问的origin进行同意处理
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");
response.setHeader("Access-Control-Allow-Credentials", "true");

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多