taotao单点登录的用户Controller、service(注册、登录、验证是否登录方法)
接口文档:
1.1. 注册接口
1.1.1. 检查数据是否可用
|
请求方法 |
GET |
|
URL |
http://sso.taotao.com/user/check/{param}/{type} |
|
参数说明 |
格式如:zhangsan/ 1,其中zhangsan是校验的数据,type为类型,可选参数1、2、3分别代表username、phone、email 可选参数callback:如果有此参数表示此方法为jsonp请求,需要支持jsonp。 |
|
示例 |
http://sso.taotao.com/user/check/zhangsan/1 |
|
返回值 |
{ status: 200 //200 成功 msg: "OK" // 返回信息消息 data: false // 返回数据,true:数据可用,false:数据不可用 } |
1.1.2. 用户注册
|
请求方法 |
POST |
|
URL |
http://sso.taotao.com/user/register |
|
参数 |
username //用户名 password //密码 phone //手机号 email //邮箱 |
|
参数说明 |
|
|
示例 |
|
|
返回值 |
{ status: 400 msg: "注册失败. 请校验数据后请再提交数据." data: null } |
1.2. 用户登录
|
请求方法 |
POST |
|
URL |
|
|
参数 |
username //用户名 password //密码 |
|
参数说明 |
|
|
示例 |
http://sso.taotao.com/user/login username=zhangsan&password=123 |
|
返回值 |
{ status: 200 msg: "OK" data: "fe5cb546aeb3ce1bf37abcb08a40493e" //登录成功,返回token } |
1.3. 通过token查询用户信息
|
请求方法 |
GET |
|
URL |
http://sso.taotao.com/user/token/{token} |
|
参数 |
token //用户登录凭证 callback//jsonp回调方法 |
|
参数说明 |
可选参数callback:如果有此参数表示此方法为jsonp请求,需要支持jsonp。 |
|
示例 |
http://sso.taotao.com/user/token/fe5cb546aeb3ce1bf37abcb08a40493e |
|
返回值 |
{ status: 200 msg: "OK" data: "{"id":1,"username":"zhangzhijun","phone":"15800807944", "email":"420840806@qq.com","created":1414119176000,"updated":1414119179000}" } |
1.4. 安全退出
|
请求方法 |
GET |
|
URL |
http://sso.taotao.com/user/logout/{token} |
|
参数 |
token //用户登录凭证 callback//jsonp回调方法 |
|
参数说明 |
可选参数callback:如果有此参数表示此方法为jsonp请求,需要支持jsonp。 |
|
示例 |
http://sso.taotao.com/user/logout/fe5cb546aeb3ce1bf37abcb08a40493e |
|
返回值 |
{ status: 200 msg: "OK" data: "" } |
Controller:
package com.taotao.sso.controller; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.ExceptionUtil;
import com.taotao.pojo.TbUser;
import com.taotao.sso.service.UserService; @Controller
@RequestMapping("/user")
public class UserController { @Autowired
private UserService userService; /**校验用户名、电话、邮箱是否重复方法
* 接口文档:
* 请求方法 GET
URL http://sso.taotao.com/user/check/{param}/{type}
参数说明
格式如:zhangsan/ 1,其中zhangsan是校验的数据,type为类型,可选参数1、2、3分别代表username、phone、email 可选参数callback:如果有此参数表示此方法为jsonp请求,需要支持jsonp。
*/
@RequestMapping("/check/{param}/{type}")
@ResponseBody
public Object checkData(@PathVariable String param,@PathVariable Integer type,String callback){
//返回结果
TaotaoResult result = null;
//校验参数是否正确(注意:在Controller中校验即可,service中可以不校验了)
if (StringUtils.isEmpty(param)) {
result = TaotaoResult.build(400, "校验内容不能为空");
}
if (type==null) {
result = TaotaoResult.build(400, "校验内容参数不能为空");
}
if (1!=type && 2!=type && 3!=type) {
result = TaotaoResult.build(400, "校验内容类型错误");
}
//说明参数异常需要提前返回
if (result!=null) {
//判断是否需要支持jsonP
if (callback!=null) {
//需要将返回结果封装成支持jsonP的形式(注意:这种返回json支持的写法)
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}else{
return result;
}
}
//因为是提供接口服务,所以要处理可能出现的逻辑上的异常
try {
//调用service执行正常的业务逻辑
result = userService.checkData(param, type);
} catch (Exception e) {
result = TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
//正常返回也需要判断是否需要jsonP
if (null!=callback) {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}else{
return result;
}
} //用户注册
@RequestMapping("/register")
@ResponseBody
public TaotaoResult createUser(TbUser user) {
try {
TaotaoResult result = userService.createUser(user);
return result;
} catch (Exception e) {
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
} //用户登录
@RequestMapping("/login")
@ResponseBody
public TaotaoResult userLogin(String username,String password){
//因为是接口服务端,所以要try处理异常
try {
TaotaoResult result = userService.userLogin(username, password);
return result;
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
} //根据token获取用户信息(判断是否登录)
@RequestMapping("/token/{token}")
@ResponseBody
public Object getUserByToken(@PathVariable String token,String callback){
TaotaoResult result = null;
try {
result = userService.getUserByToken(token);
} catch (Exception e) {
e.printStackTrace();
result = TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
//判断是否为jsonp调用
if (StringUtils.isEmpty(callback)) {
return result;
}else{
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
} }
Service:
package com.taotao.sso.service.impl; import java.util.Date;
import java.util.List;
import java.util.UUID; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.propertyeditors.UUIDEditor;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils; import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.JsonUtils;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.dao.JedisClient;
import com.taotao.sso.service.UserService;
/**
* 用户管理的service
* @author Administrator
*/
@Service
public class UserServiceImpl implements UserService { @Autowired
private TbUserMapper userMapper; @Autowired
private JedisClient jedisClient; // #用户session在redis中保存的key
@Value("${REDIS_USER_SESSION_KEY}")
private String REDIS_USER_SESSION_KEY; //REDIS_USER_SESSION_KEY=REDIS_USER_SESSION // #session的过期时间30分钟
@Value("${SSO_SESSION_EXPIRE}")
private Integer SSO_SESSION_EXPIRE; //SSO_SESSION_EXPIRE=1800 //校验用户名、电话、邮箱 是否不重复
@Override
public TaotaoResult checkData(String content, Integer type) {
//创建查询对象
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
//封装查询条件
switch (type) {
case 1:
criteria.andUsernameEqualTo(content);
break;
case 2:
criteria.andPhoneEqualTo(content);
break;
case 3:
criteria.andEmailEqualTo(content);
break;
}
//因为在Controller层中调用此接口前就已经校验过 type的值一定为123中的一个,所以这里不用再次校验了
//执行查询
List<TbUser> list = userMapper.selectByExample(example);
if (list!=null && list.size()>0) {
return TaotaoResult.ok(false);
}
return TaotaoResult.ok(true);
} //用户注册
@Override
public TaotaoResult createUser(TbUser user) {
user.setCreated(new Date());
user.setUpdated(new Date());
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
userMapper.insert(user);
return TaotaoResult.ok();
} //用户登录
@Override
public TaotaoResult userLogin(String username, String password) {
//和数据库中数据比对
TbUserExample example = new TbUserExample();
example.createCriteria().
andUsernameEqualTo(username).
andPasswordEqualTo(DigestUtils.md5DigestAsHex(password.getBytes()));
List<TbUser> list = userMapper.selectByExample(example);
if (list==null || list.size()==0) {
return TaotaoResult.build(400, "用户名或密码错误");
}
//说明登录成功,获取用户对象
TbUser user = list.get(0);
//生成token,并把用户存入redis中
//注意:这种生成uuid的方法(无需引入其他jar包,用的java.util包)
String token = UUID.randomUUID().toString();
//注意:存入redis中的用户信息的key 是 大分类 + : +生成的 uuid,value 是用户的对象转json串
String key = REDIS_USER_SESSION_KEY+":"+token;
//为了安全,在存入用户信息前先将用户密码去掉
user.setPassword(null);
String userJson = JsonUtils.objectToJson(user);
//将用户存入redis中
jedisClient.set(key, userJson);
//注意:这里用户登录后把用户信息及token存入redis是正常的业务逻辑,如果失败,需要整个方法回滚,所以不用单独try
//设置过期时间
jedisClient.expire(key, SSO_SESSION_EXPIRE);
return TaotaoResult.ok(token);
} //根据token判断用户是否为登录状态
@Override
public TaotaoResult getUserByToken(String token) {
//拿token到redis中取用户信息 REDIS_USER_SESSION;:8d7b07f2-eb83-4446-bab4-bc1416727b5f
String key = REDIS_USER_SESSION_KEY+":"+token;
String json = jedisClient.get(key);
//判断是否为空
if (StringUtils.isEmpty(json)) {
return TaotaoResult.build(400, "此session已经过期,请重新登录");
}
//并更新过期时间
jedisClient.expire(key, SSO_SESSION_EXPIRE);
//返回用户信息
return TaotaoResult.ok(JsonUtils.jsonToPojo(json, TbUser.class));
}
}
taotao单点登录的用户Controller、service(注册、登录、验证是否登录方法)的更多相关文章
- 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...
- 用户 'NT Service\MSSQLServerOLAPService' 登录失败
初学SSAS,部署微软官方示例项目AdventureWorksDW2012Multidimensional时出现错误:用户 'NT Service\MSSQLServerOLAPService' 登录 ...
- 一步步使用SpringBoot结合Vue实现登录和用户管理功能
前后端分离开发是当今开发的主流.本篇文章从零开始,一步步使用SpringBoot结合Vue来实现日常开发中最常见的登录功能,以及登录之后对用户的管理功能.通过这个例子,可以快速入门SpringBoot ...
- Java Web基础——Controller+Service +Dao三层的功能划分
转自:https://www.cnblogs.com/cielosun/articles/5752272.html 1. Controller/Service/DAO简介: Controller是管理 ...
- 后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户)
后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户) 一.总结 一句话总结: 1.中间件中验证用户是否登录:if(!Auth::guard('admin')->c ...
- SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法
SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
转载:http://itindex.net/detail/50710-springaop-controller-service 从业近二,三年了,第一次写博客,平时做做脚手架或者架构一些基础框架然后给 ...
- CAS学习笔记(三)—— SERVER登录后用户信息的返回
一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户信息吧,不然客户端是怎么知道登录的是哪个用户.那么客户端要怎么获取用户信息呢? 其实验证成 ...
- 单点登录CAS使用记(四):为登录页面加上验证码
CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...
随机推荐
- IO复用——epoll系列系统调用
1.内核事件表 epoll是Linux特有的I/O复用函数.epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表.这个额外文件描述符使用函数epo ...
- HDU 1495 非常可乐 (只是转了个弯的广搜题)
N - 非常可乐 =========================================================================================== ...
- JS 实现随机验证码功能
1.验证码 验证是网页常出现的一个验证点,所谓验证码类型有很多,下面代码只是实现一个简单的验证功能. <div> <input type = "text" id ...
- 【python3.X】python学习中排雷过程^_^
问题一:python读取文件时报错:“UnicodeDecodeError: 'gbk' codec can't decode byte 0x8d in position 52: illegal mu ...
- 开源版本 hadoop-2.7.5 + apache-hive-2.1.1 + spark-2.3.0-bin-hadoop2.7整合使用
一,开源软件版本: hadoop版本 : hadoop-2.7.5 hive版本 :apache-hive-2.1.1 spark版本: spark-2.3.0-bin-hadoop2.7 各个版本到 ...
- SpringBoot学习:使用logback进行日志记录
项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)pom.xml文件中引入jar: <!-- https://mvnrepos ...
- Qt Qwdget 汽车仪表知识点拆解6 自定义控件
先贴上效果图,注意,没有写逻辑,都是乱动的 这里说一下控件自定义 图中标出的部分都是自定义的控件 这里如果我们有批量类似的功能,就可以使用自定义控件的方式,这里我已下面的自定义控件说一下,上面的在上一 ...
- 第二十二篇 正在表达式 re模块
re模块****** 就本质而言,正则表达式时一种小型的,高度专业化的编程语言,在python里,它内嵌在python中,并通过re模块实现.正则表达式模式被编译成一系列的字节码.然后用C编写的匹配引 ...
- python3学习之路_day1
登录程序1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 #!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor gushiren 20 ...
- 安装 Win10 & Ubuntu 16.04 双系统以及 Ubuntu 配置深度学习环境记录
0. 前言 坑爹的Ubuntu晚上运行还是好好的,第二天中午的时候打开机器发现屏幕分辨率不正常了:2K屏显示800*600左右的分辨率(无法调节),一个图标一拳头大,窗口和网页显示不全.Google查 ...