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启动后,先调用后是否登录的接口。如果登录了。既可以执行所有的操作;
登录代码:
验证登录代码:
这里有一个问题,这里没有设计memcached数据有效期。如果设计了有效期。那么memcached 失效的数据去了哪里了呢 ?
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 失效的数据去了哪里了呢 ?
相关文章推荐
- Android之线程池ExecutorService
- ios多线程使用精讲
- 数组类型不同解析问题探究
- 几个有意思的小程序
- Android-一个页面中实现短信验证
- Android SwitchCompat 自定义颜色 及使用
- android的属性动画
- spring mvc 入门系列之四--关于handlerMapping
- The dependency `AFNetworking` is not used in any concrete target.
- 断点调试总结.md
- Android开发之RecyclerView的使用
- 如何根据标注图中的px确定dp
- 1.0、Android Studio管理你的项目
- Android 怎么实现支持所有View的通用的下拉刷新控件
- 1、Android Studio管理你的项目
- Android 隐藏程序的图标并使用其他APP启动
- android 之popupWindow 在指定位置上的显示
- APP | 001-Android.APP——JavaWeb后台
- android 自定义PopupWindow,注意的问题
- Android 6.0 申请权限Permission Denial: reading com.android.providers.media.MediaProvider