管理端登录业务逻辑- 服务器提供非授权接口获取appid、redirectUrl参数
- 前端通过引用js文件,加载页面时生成微信二维码
window.onload = (function wxLogin(){
var obj = new WxLogin
({
id:"login_container",
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
}});
response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080")
response.setHeader("Access-Control-Allow-Credentials", "true")
|