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; }
註冊功能實現