Web流行框架SSM+Shiro+Bootstrap+Jquery项目实践之注册
2018-02-01 19:01
411 查看
本来这次是计划写快速登陆的,但开发到一半,发现第三方OAuth授权申请条件达不到(没有公网服务器、域名,而且类似QQ这种第三方登陆授权还需要企业营业执照,太难啦),所以等我租服务器将项目放到公网上再完成那个功能吧。先做个注册功能吧,注册和前面的登陆大同小异,比登陆功能稍微简单些,不用重新写shiro授权服务,说白了就是向用户表中添加一条记录。 首先是界面,这里要新建一个register.jsp:
如何进入这个注册界面?咱们还是回到登陆界面去看看
没错,点击登陆界面的“注册”链接就会跳转到新用户注册界面,这里点击的链接是下面的“/register”
这是个get请求,后台对应的方法会响应这个请求,这个方法我写到了LoginController.java中
很简单的代码,就是让它找个register.jsp并返回给浏览器,现在注册界面就打开了,我们看看
同样我们也给注册表单定义了一系列标准的validator验证配置
这里面还有手机号和邮箱的唯一性验证,是动态请求后台服务的,下面这一段是前台的
后台的代码也是写在了LoginController.java中,请看
UserService.java接口中增加一个方法public TbUser getUserByOtherWay(String otherWayValue);
UserServiceImpl.java实现这个方法:
我们来试验一下,比如表单中填写手机号,我们先从用户表中找一条用户数据,用他的手机号填写
表单验证效果如下:
注意:这里请求验证的uri“/oauth/checkUnique”要添加到Shiro的白名单配置中,不然可是会被拦截的
一大堆验证基本结束了,现在来真正写注册了,前端要在注册按钮上绑定javascript函数register()。
在login.js中添加一个register()函数
后台响应的方法:
UserService.java接口: public TbUser saveUser(TbUser user);
UserServiceImpl.java实现此方法:
这里面的代码分两个部分:1、保存新用户到数据库。2、调用之前的登陆方法自动登陆
补充一下:前端注册函数,它还有一个限制,就是要勾选XXX协议,看下效果
不勾选的话是不会注册的,会弹出一个模态提示框,这个是base-modal.js实现的
要做到人性化,及时将信息反馈给用户,带来好的体验,告诉他们应该怎么做才能避免操作错误,下面就勾选上
点击注册,会自动登陆到主页,看看效果,主页才开始做,使用的easyui开发,以后的章节详细讲解
我们到数据库中查看,可以看到看到已经新增了一条用户数据
注册功能基本完成。想要源码的朋友,等我把代码放到github上,再分享地址出来,我现在是用的svn仓库。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>信息管理系统 - 注册</title> <meta name="keywords" content="perfect-ssm"> <meta name="description" content="perfect-ssm"> <!--icon--> <link rel="shortcut icon" type="image/x-icon" href="css/common/favicon.ico" media="screen" /> <!-- Bootstrap 3.3.6 --> <link rel="stylesheet" href="css/adminlte/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="css/common/libs/font-awesome/css/font-awesome.min.css"> <!-- Ionicons --> <link rel="stylesheet" href="css/common/libs/ionicons/css/ionicons.min.css"> <!-- Theme style --> <link rel="stylesheet" href="css/adminlte/dist/css/AdminLTE.min.css"> <!-- iCheck --> <link rel="stylesheet" href="css/adminlte/plugins/iCheck/square/red.css"> <link rel="stylesheet" href="css/adminlte/plugins/bootstrap-validator/dist/css/bootstrap-validator.css" /> <!-- 动画进入 --> <link rel="stylesheet" href="css/animate.min.css" /> </head> <body class="hold-transition login-page"> <div class="login-box animated fadeInDown"> <div class="login-logo"> <a href="#"><b>IM</b>System</a> </div> <!-- /.login-logo --> <div class="login-box-body"> <p class="login-box-msg"> <strong>新用户注册</strong> </p> <form action="##" method="post" onsubmit="return false" role="form" id="register-form"> <div class="form-group has-feedback"> <input type="text" class="form-control" name="username" id="username" placeholder="请输入用户名" required> <span class="glyphicon glyphicon-user form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input type="text" class="form-control" name="phone" id="phone" placeholder="请输入手机号"> <span class="glyphicon glyphicon-phone form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input type="text" class="form-control" name="email" id="email" placeholder="请输入邮箱"> <span class="glyphicon glyphicon-envelope form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input type="password" class="form-control" name="password" id="password" placeholder="请输入密码"> <span class="glyphicon glyphicon-lock form-control-feedback"></span> </div> <div class="form-group has-feedback"> <input type="password" class="form-control" name="repassword" id="repassword" placeholder="再次确认密码"> <span class="glyphicon glyphicon-log-in form-control-feedback"></span> </div> <div class="row"> <div class="col-xs-12"> <div class="checkbox icheck"> <label> <input type="checkbox" id="agreement" class="icheck" required> 同意遵循<a href="#">IMSysyem协议</a> </label> </div> </div> <!-- /.col --> </div> <div class="row"> <div class="col-xs-12"> <button type="button" class="btn btn-danger btn-block btn-flat" onclick="javascript:register();">注 册</button> </div> </div> </form> </div> </div> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <script src="http://apps.bdimg.com/libs/bootstrap/3.3.4/js/bootstrap.min.js"></script> <script src="js/jquery.serializejson.min.js"></script> <!-- bootstrap-validator--> <script src="css/adminlte/plugins/bootstrap-validator/dist/js/bootstrap-validator.js"></script> <!-- iCheck --> <script src="css/adminlte/plugins/iCheck/icheck.min.js"></script> <script src="js/common.js"></script> <script src="js/base-modal.js"></script> <script src="js/login.js"></script> <script type="text/javascript"> /* 初始化check 改变为ickeckbox*/ $(function() { $('input.icheck').iCheck({ checkboxClass : 'icheckbox_square-red', radioClass : 'iradio_square-red', increaseArea : '20%' // optional }); $("#register-form").bootstrapValidator({ submitHandler : function(valiadtor, loginForm, submitButton) { if (!$("#agreement").is(":checked")) { modals.info("请先勾选同意遵循IMSysyem协议"); return; } valiadtor.defaultSubmit(); }, fields : { username : { validators : { notEmpty : { message : '用户名不能为空' }, stringLength : { /*长度提示*/ min : 2, max : 15, message : '用户名长度必须在2到15之间' }, threshold : 2,//只有2个字符以上才发送ajax请求 remote : { url : "/oauth/checkUnique", data : function(validator) { return { inputvalue : $("#username").val() }; }, message : '该用户名已被使用,请使用其他用户名', delay : 2000 } } }, phone : { validators : { notEmpty : { message : '手机号不能为空' }, stringLength : { /*长度提示*/ min : 11, max : 11, message : '手机号必须11位数' }, threshold : 11,//只有11个字符以上才发送ajax请求 remote : { url : "/oauth/checkUnique", data : function(validator) { return { inputvalue : $("#phone").val(), username : null }; }, message : '该手机号已被使用,请使用其他手机号', delay : 2000 } } }, email : { validators : { notEmpty : { message : '登录邮箱名不能为空' }, stringLength : { /*长度提示*/ min : 4, max : 30, message : '邮箱长度必须在4到30之间' }, threshold : 4,//只有4个字符以上才发送ajax请求 remote : { url : "/oauth/checkUnique", data : function(validator) { return { inputvalue : $("#email").val(), username : null }; }, message : '该邮箱已被使用,请使用其他邮箱', delay : 2000 } } }, password : { validators : { notEmpty : { message : '密码不能为空' }, stringLength : { /*长度提示*/ min : 6, max : 30, message : '密码长度必须在6到30之间' }, different : {//不能和用户名相同 field : 'loginName',//需要进行比较的input name值 message : '不能和用户名相同' }, regexp : { regexp : /^[a-zA-Z0-9_\.]+$/, message : '密码由数字字母下划线和.组成' } } }, repassword : { message : '密码无效', validators : { notEmpty : { message : '密码不能为空' }, stringLength : { min : 6, max : 30, message : '用户名长度必须在6到30之间' }, identical : {//相同 field : 'password', message : '两次密码不一致' }, different : {//不能和用户名相同 field : 'loginName', message : '不能和用户名相同' }, regexp : {//匹配规则 regexp : /^[a-zA-Z0-9_\.]+$/, message : '密码由数字字母下划线和.组成' } } } } }); }); </script> </body> </html>
如何进入这个注册界面?咱们还是回到登陆界面去看看
没错,点击登陆界面的“注册”链接就会跳转到新用户注册界面,这里点击的链接是下面的“/register”
<div class="col-xs-6"> <div class="checkbox pull-right"> <a href="#">忘记密码</a> <span> / </span> <a href="/register" class="text-center">注册</a> </div> </div>
这是个get请求,后台对应的方法会响应这个请求,这个方法我写到了LoginController.java中
@RequestMapping(value = "/register", method = RequestMethod.GET) public String register() { return "register"; }
很简单的代码,就是让它找个register.jsp并返回给浏览器,现在注册界面就打开了,我们看看
同样我们也给注册表单定义了一系列标准的validator验证配置
这里面还有手机号和邮箱的唯一性验证,是动态请求后台服务的,下面这一段是前台的
remote : { url : "/oauth/checkUnique", data : function(validator) { return { inputvalue : $("#phone").val(), username : null }; }, message : '该手机号已被使用,请使用其他手机号', delay : 2000 }
后台的代码也是写在了LoginController.java中,请看
@RequestMapping(value = "/oauth/checkUnique", method = RequestMethod.POST) @ResponseBody public Map checkUnique(String inputvalue) { Map<String, Boolean> map = new HashMap<String, Boolean>(); TbUser user = userService.getUserByOtherWay(inputvalue); // 用户不存在,校验有效 if (user == null) { map.put("valid", true); } else { map.put("valid", false); } return map; }
UserService.java接口中增加一个方法public TbUser getUserByOtherWay(String otherWayValue);
UserServiceImpl.java实现这个方法:
@Override public TbUser getUserByOtherWay(String otherWayValue) { TbUserExample tbUserExample = new TbUserExample(); if (otherWayValue != null && !otherWayValue.isEmpty()) { // 条件1 匹配用户名 Criteria createCriteria = tbUserExample.createCriteria(); createCriteria.andUsernameEqualTo(otherWayValue); // 条件2 匹配手机号码 Criteria createCriteria2 = tbUserExample.or(); createCriteria2.andPhoneEqualTo(otherWayValue); // 条件3 匹配邮箱 Criteria createCriteria3 = tbUserExample.or(); createCriteria3.andPhoneEqualTo(otherWayValue); List<TbUser> selectByExample = tbUserMapper .selectByExample(tbUserExample); if (selectByExample != null && !selectByExample.isEmpty()) { return selectByExample.get(0); } } return null; }
我们来试验一下,比如表单中填写手机号,我们先从用户表中找一条用户数据,用他的手机号填写
表单验证效果如下:
注意:这里请求验证的uri“/oauth/checkUnique”要添加到Shiro的白名单配置中,不然可是会被拦截的
<!-- 具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截. --> <property name="filterChainDefinitions"> <value> /css/** = anon /js/** = anon /login = anon /register = anon /oauth/** = anon /** = authc </value> </property>
一大堆验证基本结束了,现在来真正写注册了,前端要在注册按钮上绑定javascript函数register()。
在login.js中添加一个register()函数
function register() { // 是否同意了条款 if (!$("#agreement").is(":checked")) { modals.info("请先勾选同意遵循IMSysyem协议"); return; } // 获取表单对象 var bootstrapValidator = $('#register-form').data('bootstrapValidator'); // 验证表单 bootstrapValidator.validate(); // 是否通过了验证 if (!$('#register-form').data('bootstrapValidator').isValid()) { return; } // 获取表单内容 var data = $('#register-form').serializeJSON(); console.log(data); $.ajax({ type : "POST", dataType : "json", contentType : "application/json;charset=utf-8", url : "/register", data : JSON.stringify(data),// 这里要传json字符串 success : function(result) { var resultdata = result.data; if (resultdata) { if(result.status == 500){ modals.info(result.msg); return ; } } // 跳转主页 window.location.href = "/"; }, error : function() { modals.info("注册异常"); } }); }
后台响应的方法:
@RequestMapping(value = "/register", method = RequestMethod.POST) @ResponseBody public CommonResult register(@RequestBody TbUser user) { TbUser tbUser = userService.saveUser(user); // 自动登陆 return loginUser(tbUser); }
UserService.java接口: public TbUser saveUser(TbUser user);
UserServiceImpl.java实现此方法:
@Override public TbUser saveUser(TbUser user) { if (user != null) { Date created = new Date(); user.setCreated(created); user.setUpdated(created); int insertSelective = tbUserMapper.insertSelective(user); if (insertSelective > 0) { TbUserExample tbUserExample = new TbUserExample(); Criteria createCriteria = tbUserExample.createCriteria(); createCriteria.andUsernameEqualTo(user.getUsername()); List<TbUser> selectByExample = tbUserMapper .selectByExample(tbUserExample); if (selectByExample != null && !selectByExample.isEmpty()) { return selectByExample.get(0); } } } return null; }
这里面的代码分两个部分:1、保存新用户到数据库。2、调用之前的登陆方法自动登陆
补充一下:前端注册函数,它还有一个限制,就是要勾选XXX协议,看下效果
不勾选的话是不会注册的,会弹出一个模态提示框,这个是base-modal.js实现的
要做到人性化,及时将信息反馈给用户,带来好的体验,告诉他们应该怎么做才能避免操作错误,下面就勾选上
点击注册,会自动登陆到主页,看看效果,主页才开始做,使用的easyui开发,以后的章节详细讲解
我们到数据库中查看,可以看到看到已经新增了一条用户数据
注册功能基本完成。想要源码的朋友,等我把代码放到github上,再分享地址出来,我现在是用的svn仓库。
相关文章推荐
- Web流行框架SSM+Shiro+Bootstrap+Jquery项目实践之快速登陆
- 【SSM框架 SSM项目源码 SSM源码 下载】java框架整合Springmvc+mybatis+shiro+bootstrap
- MyEclipse使用Maven创建web项目+搭建SSM框架
- Shiro权限控制框架入门2:如何将Shiro非入侵地整合到SpringMVC等Web项目中
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十五节--缓存小结与ABP框架项目中 Redis Cache的实现
- 【SSM】Eclipse使用Maven创建Web项目+整合SSM框架
- Java源码 JavaWeb开发框架 代码 SSH SSM OA ERP CRM Java项目[Java通用框架源码及开发视频教程]
- 【SSM】Eclipse使用Maven创建Web项目+整合SSM框架
- SSM + Shiro 整合(4)- 在 Web 项目中添加 Shiro
- VUE+TS+WEBPACK框架的项目实践
- JavaWeb项目:Shiro实现简单的权限控制(整合SSM)
- shiro权限框架详解06-shiro与web项目整合(上)
- JavaWeb框架-SSM-普通Web项目整合流程!
- MyEclipse使用Maven创建web项目+搭建SSM框架教程
- Eclipse使用Maven创建Web项目+整合SSM框架
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
- SSM框架之SpringMVC(2)--web项目的基本架构
- Shiro权限控制框架 ---SpringMVC+Spring+My batis+Mysql+Maven集成开发Web项目
- 分布式框架简介SSM组合+ springmvc+mybatis+shiro+restful+bootstrap
- P2P互联网金融平台项目SSM+Redis+Mysql+Bootstrap+JQuery