今日内容一:检查登入数据是否可用
功能分析
请求的url:/user/check/{param}/{type}
参数:从url中取参数1、String param(要校验的数据)2、Integer type(校验的数据类型)
响应的数据:json数据。e3Result,封装的数据校验的结果true:成功false:失败。
业务逻辑:
1、从tb_user表中查询数据
2、查询条件根据参数动态生成。
3、判断查询结果,如果查询到数据返回false。
4、如果没有返回true。
使用e3Result包装,并返回。
interface:
代码实现:
//校验登入的数据
E3Result checkData(String param,int type);
service:
代码实现:
/*
* 校验用户名是否存在
*/
@Override
public E3Result checkData(String param, int type) {
//根据不同的type生成不同的查询条件
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
//1:用户名 2:手机号 3:邮箱
if (type == 1) {
criteria.andUsernameEqualTo(param);
}else if(type == 2){
criteria.andPhoneEqualTo(param);
}else if (type == 3) {
criteria.andEmailEqualTo(param);
}else {
return E3Result.build(400, "数据类型有误");
}
//执行查询
List<TbUser> list = userMapper.selectByExample(example);
//判断结果中是否包含数据
if(list != null && list.size() > 0){
//如果有数据返回false
return E3Result.ok(false);
}
//如果没有数据返回true
return E3Result.ok(true);
}
controller:
//校验用户名是否存在
@RequestMapping("/user/check/{param}/{type}")
@ResponseBody
public E3Result checkData(@PathVariable String param,@PathVariable Integer type){
E3Result result = registerService.checkData(param, type);
return result;
}
今日内容二:用户注册
功能分析
请求的url:/user/register
参数:表单的数据:username、password、phone、email
返回值:json数据。e3Result
接收参数:使用TbUser对象接收。
请求的方法:post
业务逻辑:
1、使用TbUser接收提交的请求。
2、补全TbUser其他属性。
3、密码要进行MD5加密。
4、把用户信息插入到数据库中。
5、返回e3Result。
interface:
//注册用户
E3Result createUser(TbUser user);
service:
/*
* 判断用户是否存在,注册用户
*/
@Override
public E3Result createUser(TbUser user) {
// 1、使用TbUser接收提交的请求。
if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())
|| StringUtils.isBlank(user.getPhone())) {
return E3Result.build(400, "数据不完整,请重新输入");
}
//1:用户名 2:手机号 3:邮箱
E3Result result = checkData(user.getUsername(), 1);
if(!(boolean) result.getData()){
return E3Result.build(400, "用户名已被占用");
}
result = checkData(user.getPhone(), 2);
if(!(boolean) result.getData()){
return E3Result.build(400, "手机号被占用");
}
// 2、补全TbUser其他属性。
user.setCreated(new Date());
user.setUpdated(new Date());
// 3、密码要进行MD5加密。
String password = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
user.setPassword(password);
// 4、把用户信息插入到数据库中。
userMapper.insert(user);
// 5、返回e3Result。
return E3Result.ok();
}
controller:
//注册用户
@RequestMapping(value="/user/register",method=RequestMethod.POST)
@ResponseBody
public E3Result register(TbUser user){
E3Result e3Result = registerService.createUser(user);
return e3Result;
}
今日内容三:用户登录
功能分析
请求的url:/user/login
请求的方法:POST
参数:username、password,表单提交的数据。可以使用方法的形参接收。
返回值:json数据,使用e3Result包含一个token。
业务逻辑:
登录的业务流程:
1、登录页面提交用户名密码。
2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
4、使用String类型保存Session信息。可以使用“前缀:token”为key
5、设置key的过期时间。模拟Session的过期时间。一般半个小时。
6、把token写入cookie中。
7、Cookie需要跨域。例如www.e3.com\sso.e3.com\order.e3.com,可以使用工具类。
8、Cookie的有效期。关闭浏览器失效。
登录成功。
interface:
//用户登入
E3Result userLogin(String username,String password);
service:
参数:
1、用户名:String username
2、密码:String password
返回值:e3Result,包装token。
业务逻辑:
1、判断用户名密码是否正确。
2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
4、使用String类型保存Session信息。可以使用“前缀:token”为key
5、设置key的过期时间。模拟Session的过期时间。一般半个小时。
6、返回e3Result包装token。
/**
* 用户登入处理
* <p>Title: LoginServiceImpl</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
@Service
public class LoginServiceImpl implements LoginService {
@Autowired
private TbUserMapper userMapper;
@Autowired
private JedisClient jedisClient;
@Value("${SESSION_EXPIRE}")
private Integer SESSION_EXPIRE;
@Override
public E3Result userLogin(String username, String password) {
// 1、判断用户和密码是否正确
// 根据用户名查询用户信息
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
//执行查询
List<TbUser> list = userMapper.selectByExample(example);
//返回登录失败
if(list == null || list.size() == 0){
return E3Result.build(400, "用户名或者密码错误");
}
//取用户信息
TbUser user = list.get(0);
//判断密码是否正确
if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(user.getPassword())) {
// 2、如果不正确,返回登录失败
return E3Result.build(400, "用户名或者密码错误");
}
// 3、如果正确生成token。
String token = UUID.randomUUID().toString();
// 4、把用户信息写入redis,key:token value:用户信息
user.setPassword(null);
jedisClient.set("SESSION:"+token, JsonUtils.objectToJson(user));
// 5、设置Session的过期时间
jedisClient.expire("SESSION:"+token, SESSION_EXPIRE);
// 6、把token返回
return E3Result.ok(token);
}
}
controller:
/**
* 用户登录处理
* <p>Title: LoginController</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
@Controller
public class LoginController {
@Autowired
private LoginService loginService;
@Value("${TOKEN_KEY}")
private String TOKEN_KEY;
@RequestMapping("/page/login")
public String showLogin() {
return "login";
}
@RequestMapping(value="/user/login", method=RequestMethod.POST)
@ResponseBody
public E3Result login(String username, String password,
HttpServletRequest request, HttpServletResponse response) {
E3Result e3Result = loginService.userLogin(username, password);
//判断是否登录成功
if(e3Result.getStatus() == 200) {
String token = e3Result.getData().toString();
//如果登录成功需要把token写入cookie
CookieUtils.setCookie(request, response, TOKEN_KEY, token);
}
//返回结果
return e3Result;
}
}
今日内容四:通过token查询用户信息
interface:
//根据token查询用户信息
E3Result getUserByToken(String token);
service:
/**
* 根据token取用户信息
* <p>Title: TokenServiceImpl</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
@Service
public class TokenServiceImpl implements TokenService {
@Autowired
private JedisClient jedisClient;
@Value("${SESSION_EXPIRE}")
private Integer SESSION_EXPIRE;
@Override
public E3Result getUserByToken(String token) {
//根据token到redis中取用户信息
String json = jedisClient.get("SESSION:" + token);
//取不到用户信息,登录已经过期,返回登录过期
if (StringUtils.isBlank(json)) {
return E3Result.build(201, "用户登录已经过期");
}
//取到用户信息更新token的过期时间
jedisClient.expire("SESSION:" + token, SESSION_EXPIRE);
//返回结果,E3Result其中包含TbUser对象
TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
return E3Result.ok(user);
}
}
controller:
/**
* 根据token查询用户信息Controller
* <p>Title: TokenController</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
@Controller
public class TokenController {
@Autowired
private TokenService tokenService;
/*@RequestMapping(value="/user/token/{token}",
produces=MediaType.APPLICATION_JSON_UTF8_VALUE"application/json;charset=utf-8")
@ResponseBody
public String getUserByToken(@PathVariable String token, String callback) {
E3Result result = tokenService.getUserByToken(token);
//响应结果之前,判断是否为jsonp请求
if (StringUtils.isNotBlank(callback)) {
//把结果封装成一个js语句响应
return callback + "(" + JsonUtils.objectToJson(result) + ");";
}
return JsonUtils.objectToJson(result);
}*/
@RequestMapping(value="/user/token/{token}")
@ResponseBody
public Object getUserByToken(@PathVariable String token, String callback) {
E3Result result = tokenService.getUserByToken(token);
//响应结果之前,判断是否为jsonp请求
if (StringUtils.isNotBlank(callback)) {
//把结果封装成一个js语句响应
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
return result;
}
}