美文网首页Java框架搭建SSO
第二十篇:单点登录系统的具体实现(1)

第二十篇:单点登录系统的具体实现(1)

作者: __y | 来源:发表于2018-07-23 11:10 被阅读87次

    前言:
    上面我们已经假设已经搭建好了相应的工程,下面就是具体实现的业务逻辑代码
    主要以下业务代码需要实现:
    1、sso注册功能实现
    2、sso登录功能实现
    3、通过token获得用户信息
    4、Ajax跨域请求(jsonp)

    1.检测数据功能实现

    首先我们知道,我们实现注册功能的时候要注意校验,看有没有重复的数据
    功能分析
    请求的url:/user/check/{param}/{type}
    参数:从url中取参数1、String param(要校验的数据)2、Integer type(校验的数据类型)
    响应的数据:json数据。TaotaoResult,封装的数据校验的结果true:成功false:失败。
    业务逻辑:
    1、从tb_user表中查询数据
    2、查询条件根据参数动态生成。
    3、判断查询结果,如果查询到数据返回false。
    4、如果没有返回true。
    5、使用TaotaoResult包装,并返回。
    下面是实现
    Dao层
    从tb_user表查询。可以使用逆向工程。
    Service层

    image.png
    参数:
    1、要校验的数据:String param
    2、数据类型:int type(1、2、3分别代表username、phone、email)
    返回值:TaotaoResult
    具体代码
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private TbUserMapper userMapper;
        
        @Override
        public TaotaoResult checkData(String param, int type) {
            // 1、从tb_user表中查询数据
            TbUserExample example = new TbUserExample();
            Criteria criteria = example.createCriteria();
            // 2、查询条件根据参数动态生成。
            //1、2、3分别代表username、phone、email
            if (type == 1) {
                criteria.andUsernameEqualTo(param);
            } else if (type == 2) {
                criteria.andPhoneEqualTo(param);
            } else if (type == 3) {
                criteria.andEmailEqualTo(param);
            } else {
                return TaotaoResult.build(400, "非法的参数");
            }
            //执行查询
            List<TbUser> list = userMapper.selectByExample(example);
            // 3、判断查询结果,如果查询到数据返回false。
            if (list == null || list.size() == 0) {
                // 4、如果没有返回true。
                return TaotaoResult.ok(true);
            } 
            // 5、使用TaotaoResult包装,并返回。
            return TaotaoResult.ok(false);
        }
    
    }
    
    
    • 发布服务


      image.png

    表现层
    需要在taotao-sso-web中实现。

    • 引用服务


      image.png
    • Controller层
      请求的url:/user/check/{param}/{type}
      参数:从url中取参数1、String param(要校验的数据)2、Integer type(校验的数据类型)
      响应的数据:json数据。TaotaoResult,封装的数据校验的结果true:成功false:失败。
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
        
        @RequestMapping("/user/check/{param}/{type}")
        @ResponseBody
        public TaotaoResult checkData(@PathVariable String param, @PathVariable Integer type) {
            TaotaoResult taotaoResult = userService.checkData(param, type);
            return taotaoResult;
        }
    }
    
    
    • 测试
      启动工程
      然后访问http://localhost:8088/user/check/zhangsan/1,可以看到如下图所示结果。data返回false说明zhangsan这个用户名已经被别人注册过了。
      image.png
      把用户名修改为"zhangsan11",如下图所示,可以看到这个用户名还没有被注册。
      image.png
      我们再测试下电话,我们在数据库中复制一个已经注册过的电话
      image.png
      我们在地址栏输入http://localhost:8088/user/check/13333333333/2,如下图所示。可以看到该手机号已经被注册了。
      image.png
      下面我们再测试下邮箱是否合法,可以看到"aa@a"这个邮箱已经被注册过了。
      image.png
      我们修改下邮箱,再试试,如下图所示,可以看到这个邮箱没有被注册过。
      image.png
      提示
      当我们写完代码的时候一定要自己每种情况都测试一遍,不能写完就不管了,扔给测试,那是很浪费时间的行为!

    2.注册功能

    • 功能分析
      请求的url:/user/register
      参数:表单的数据:username、password、phone、email
      返回值:json数据。TaotaoResult
      接收参数:使用TbUser对象接收。
      请求的方法:post
      业务逻辑:
      1、使用TbUser接收提交的请求。
      2、补全TbUser其他属性。
      3、密码要进行MD5加密。
    • Dao层
      可以使用逆向工程。
    • Service层
      参数:TbUser
      返回值:TaotaoResult
    @Override
        public TaotaoResult createUser(TbUser user) {
            // 1、使用TbUser接收提交的请求。
            
            if (StringUtils.isBlank(user.getUsername())) {
                return TaotaoResult.build(400, "用户名不能为空");
            }
            if (StringUtils.isBlank(user.getPassword())) {
                return TaotaoResult.build(400, "密码不能为空");
            }
            //校验数据是否可用
            TaotaoResult result = checkData(user.getUsername(), 1);
            if (!(boolean) result.getData()) {
                return TaotaoResult.build(400, "此用户名已经被使用");
            }
            //校验电话是否可以
            if (StringUtils.isNotBlank(user.getPhone())) {
                result = checkData(user.getPhone(), 2);
                if (!(boolean) result.getData()) {
                    return TaotaoResult.build(400, "此手机号已经被使用");
                }
            }
            //校验email是否可用
            if (StringUtils.isNotBlank(user.getEmail())) {
                result = checkData(user.getEmail(), 3);
                if (!(boolean) result.getData()) {
                    return TaotaoResult.build(400, "此邮件地址已经被使用");
                }
            }
            // 2、补全TbUser其他属性。
            user.setCreated(new Date());
            user.setUpdated(new Date());
            // 3、密码要进行MD5加密。
            String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
            user.setPassword(md5Pass);
            // 4、把用户信息插入到数据库中。
            userMapper.insert(user);
            // 5、返回TaotaoResult。
            return TaotaoResult.ok();
        }
    
    
    • 发布服务和引用服务
      由于我们是在同一个服务和Controller中写,因此不用再发布和引用
    • Controller
      请求的url:/user/register
      参数:表单的数据:username、password、phone、email
      返回值:json数据。TaotaoResult
      接收参数:使用TbUser对象接收。
      请求的方法:post
    @RequestMapping(value="/user/register", method=RequestMethod.POST)
        @ResponseBody
        public TaotaoResult register(TbUser user) {
            TaotaoResult result = userService.createUser(user);
            return result;
        }
    
    
    • 测试
      可以使用一款工具,restclient-ui-3.5-jar-with-dependencies.jar测试接口。
      image.png
      我们在URL一栏输入http://localhost:8088/user/register,类型选择POST,如下图所示
      image.png
      我们点击"Body"一栏,点击下拉框会出现下拉菜单让我选择,我们选择"String body"
      image.png
      选择String body后如下图所示,默认的content-type是"text/plain",我们要把它改成表单类型
      image.png
      我们按照如下图所示更改content-type类型
      image.png
      下面我们添加参数,如下图所示,添加四个参数。
      image.png
      添加完之后,点击"Generate",如下图所示。
      image.png
      下面发送请求,如下图所示,可以看到返回的提示是用户名重复了。
      image.png
      其实我们输入的四个参数都是在数据库中存在的,除了密码,其它三个都会报不能重复的错误,要想不报错,我们要把用户名、电话、邮箱三个个参数都修改下,改成数据库中不存在的数据。如下图所示。可以看到返回的状态码是200,说明成功了
      image.png

    相关文章

      网友评论

        本文标题:第二十篇:单点登录系统的具体实现(1)

        本文链接:https://www.haomeiwen.com/subject/vqshmftx.html