1. Sso系统分析
1.1. 什么是sso系统
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
单点登录系统是使用redis模拟Session,实现Session的统一管理。
需要创建一个sso服务工程,可以参考e3-manager创建。
e3-sso(pom聚合工程)
|--e3-sso-interface(jar)
|--e3-sso-Service(war)
e3-sso-web
注册功能
1.1. 检查数据是否可用
1.1.1. 功能分析
请求的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包装,并返回。
1.1.1. Dao层
从tb_user表查询。可以使用逆向工程。
1.1.1. Service
参数:
1、要校验的数据:String param
2、数据类型:int type(1、2、3分别代表username、phone、email)
返回值:e3Result
@Autowired private TbUserMapper tbUserMapper; @Override public E3Result checkData(String params, int type) { //创建根据type不同生成查询条件 TbUserExample example=new TbUserExample(); //创建一个Criteria对象添加条件 TbUserExample.Criteria criteria = example.createCriteria(); //判断用户名是否存在 if (type==1){ criteria.andUsernameEqualTo(params); }else if (type==2){ //判断手机号码是否存在 criteria.andPhoneEqualTo(params); }else if (type==3){ //判断用户邮箱是否存在 criteria.andEmailEqualTo(params); }else { return E3Result.build(400,"数据类型错误"); } //执行查询 List<TbUser> tbUsers = tbUserMapper.selectByExample(example); //判断tbUsers中是否有数据 if (tbUsers!=null && tbUsers.size()>0){ //有数据说明查询条件中存在数据 return E3Result.ok(false); } //没有查询到数据 return E3Result.ok(true); }
applicationContent-service.xml配置 发布服务
<!--注册服务--> <dubbo:service interface="com.e3mall.sso.service.RegisterService" ref="registerServiceImpl" timeout="600000"/>
引用服务
springmvc.xml中配置
<!--用户注册服务--> <dubbo:reference interface="com.e3mall.sso.service.RegisterService" id="registerService" />
Controller
请求的url:/user/check/{param}/{type}
参数:从url中取参数1、String param(要校验的数据)2、Integer type(校验的数据类型)
响应的数据:json数据。e3Result,封装的数据校验的结果true:成功false:失败。
跳转到注册页面
@Autowired private RegisterService registerService; /** *跳转到注册页面 * @auther: jun * @date: 2018/5/31 0031 13:28 * @param * @return: java.lang.String * @Description: */ @RequestMapping("/page/register") public String showRegister() { return "register"; }数据验证消息数据类型:Integer type(1、2、3分别代表username、phone、email)
/** *注册信息中需要验证的信息 * @auther: jun * @date: 2018/5/31 0031 12:38 * @param param,type * @return: com.e3mall.common.utils.E3Result * @Description: */ @RequestMapping("/user/check/{param}/{type}") @ResponseBody public E3Result checkData(@PathVariable String param,@PathVariable Integer type){ //调用注册服务查询指定type的字段是否有param中的数据 E3Result result = registerService.checkData(param, type); //返回结果 return result; }
验证通过后我们在做注册功能
Service
@Override public E3Result register(TbUser user) { //数据有效性校验 //判断用户是为空字符串或者是空值 if (StringUtils.isBlank(user.getUsername())) { return E3Result.build(400,"用户名不能为空"); } if (StringUtils.isBlank(user.getPassword())){ return E3Result.build(400,"密码不能为空"); } if (StringUtils.isBlank(user.getPhone())){ return E3Result.build(400,"手机号码不能为空"); } //判断用户名,手机号,邮箱 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,"手机号已经被注册了"); } //补全pojo属性 user.setCreated(new Date()); user.setUpdated(new Date()); //设置密码使用md5加密 String mdPass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes()); user.setPassword(mdPass); //把数据插入到数据库中 tbUserMapper.insert(user); // 返回添加成功信息 return E3Result.ok(); }
Controller
/** *用户注册功能实现 * @auther: jun * @date: 2018/5/31 0031 12:48 * @param user * @return: com.e3mall.common.utils.E3Result * @Description: */ @RequestMapping(value = "/user/register",method =RequestMethod.POST) @ResponseBody public E3Result register(TbUser user){ //调用注册服务注册用户 E3Result result = registerService.register(user); //返回结果 return result; }
注册功能实现