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

APP登录----伪sessionId设计登录

2016-06-20 13:12 976 查看
我在以前的一篇博客中,瞎说了app和服务端sessionId传递的设计,也没有深入的理解;

sessionId这玩意只会存在web服务,也就是B/S架构的体系;

以微信登录来看一个案例,伪sessionId设计登录状态设计;

先注册,再登录哈。这里只说登录;有了sessionId,方便以后的登录验证。

设计思路:

1.APP端传入服务端微信ID:wechatId;(这里牵涉到微信开放平台的接入申请)

2.服务端接收信息,并查询登录相关表。验证用户信息;

3.将用户的属性信息(对象)装换字符串(json格式),存入memcached;

4.在APP启动后,先调用后是否登录的接口。如果登录了。既可以执行所有的操作;

登录代码:

/**
* 用户根据微信登录
* @param apiRequest
* @return
*/
@FunctionCode(value = "user.wechatLogin", descript = "用户根据微信登录")
@Override
public ApiResponse<UserPo> wechatLogin(ApiRequest apiRequest) {
Object wechatIdObj = apiRequest.get("wechatId");
Object  registrationIdObj = apiRequest.get("registrationId");
if (StringUtils.isEmpty(wechatIdObj)) {
return new ApiResponse<UserPo>(RestResultEnum.MissParameterException);
}
ApiResponse<UserPo> apiResponse = null;
try {
//判断是否注册,未注册返回信息,已经注册--查看用户是否冻结,已经冻结则返回冻结信息,未冻结则返回信息账户信息
UserPo   userPo = this.userMapper.selectUserByWechat(wechatIdObj.toString());

if (userPo != null) {
//判断用户是否处于冻结状态
if(userPo.getUserState()==1||userPo.getUserState()==2){
apiResponse = new ApiResponse<UserPo>(RestResultEnum.UserLockedException, 1, userPo);//用户被冻结
}else{
// 将用户对象放入memcached
String cookieUserId = RandomIDUtil.getNewUUID();
userPo.setCookieUserId(cookieUserId);
String memKey = MemcachedKeyEnum.USER_SESSION.name() + "-" + cookieUserId;
System.out.println("cookieUserId==="+cookieUserId);
MemcachedUtil.getInstance().set(memKey, userPo);
String memKeyJson = MemcachedKeyEnum.USER_SESSION_JSON.name() + "-" + cookieUserId;
System.out.println("memKeyJson==="+memKeyJson);
MemcachedUtil.getInstance().set(memKeyJson, JsonUtil.object2Fastjson(userPo));
String registrationId = userPo.getRegistrationId();//推送Id
if(!StringUtils.isEmpty(registrationIdObj) && !registrationId.equals(registrationIdObj.toString())){
UserPo userPou = new UserPo();
userPou.setUserId(userPo.getUserId());
userPou.setRegistrationId(registrationIdObj.toString());
userMapper.updateUserHiddenState(userPou);
}
apiResponse = new ApiResponse<UserPo>(RestResultEnum.SUCCESS, 1, userPo);//正常用户
}
}else{
apiResponse = new ApiResponse<UserPo>(RestResultEnum.NoRegisterException, 1, null);//
}
} catch (Exception e) {
e.printStackTrace();
apiResponse = new ApiResponse<UserPo>(RestResultEnum.INVOKE_ERROR);//出现异常
}
return apiResponse;
}


验证登录代码:

@FunctionCode(value ="sysUser.isLogin", descript = "系统用户是否已经登录")
@Override
public ApiResponse<UserPo> isLogin(ApiRequest apiRequest) {
Object cookieUserIdObj = apiRequest.get("cookieUserId");
if (StringUtils.isEmpty(cookieUserIdObj)) {
return new ApiResponse<UserPo>(RestResultEnum.MissParameterException);
}
ApiResponse<UserPo> apiResponse = null;
try {
UserPo UserPo = null;
if (cookieUserIdObj != null) {
UserPo = getUserDtoFromMemcached(cookieUserIdObj.toString());
apiResponse = new ApiResponse<UserPo>(RestResultEnum.SUCCESS, 1, UserPo);
}
} catch (Exception e) {
apiResponse = new ApiResponse<UserPo>(RestResultEnum.INVOKE_ERROR);
}
return apiResponse;
}


这里有一个问题,这里没有设计memcached数据有效期。如果设计了有效期。那么memcached  失效的数据去了哪里了呢 ?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: