登陆模块目标
我要将其弄成类似的登陆,功能是要比较完善的。
本来我是想做一步写一步的,但是发现这样文章就会太乱,因为要改的地方太多了。前面写过的,后边就被修改了。这样看起来太混乱了。因此我现在是写完代码才来补这篇记录的。尽可能把当时的思路记录下来,并且捋一捋看一下有没有不足的地方。
编写注册模块过程
我的登陆注册模块主要是使用邮箱,这部分之前是没有了解过的。因此去找了一点资料。想完成使用邮箱来激活用户的思路可看下面:
http://blog.csdn.net/u013863751/article/details/45600651
根据这个思路,我就创建数据库表了,数据库表的设计如下:
设计完数据库表之后就去写前台页面了。因为登陆注册这部分的Dao层并不难,就几个简单的方法。
注册页面和校验
前台我使用的是Bootstrap为主,登陆注册模块是使用bootstrap官网提供的模版。
导航栏是使用之前看见过别人博客上的导航条:
http://blog.csdn.net/iamcgt/article/details/72863303
有了导航条和bootstrap官网提供的登陆注册模版了,背景现在太过单薄了。我想到了一个开源的项目:https://github.com/VincentGarreau/particles.js。于是下载下来改了一下。我的首页样式就有了。
particles.js参考教程:
http://blog.csdn.net/csdn_yudong/article/details/53128570
使用时要注意的是:particles div中包含的内容需要绝对定位。
注册的时候需要做前台校验的。本来是想自己写正则表达式做校验的,后来发现有BootstrapValidation这样一个组件。于是就去下载使用了。
boostrapValidation参考教程:
http://www.cnblogs.com/huangcong/p/5335376.html
http://blog.csdn.net/nazhidao/article/details/51542508
bootstrapValidation有一个坑,submitHandler提交方法只有0.45版本才有效(亲测)。后来在寻找版本的时候发现了一个非常有用的网站:能够查询到多个版本,十分好用。
经过一顿整改,我的页面和验证效果如下:
注册后台
做了前台的校验是不够的。因为有可能别人是知道我们注册的url就直接对其进行访问了(绕过bootstrapValidation来注册),因此我们还需要做后台校验。后台校验我使用的是SpringMVC的校验。也就是 Hibernate Validator(和Hibernate的ORM无关)。
要使用springMVC校验就要导入对应的maven坐标:
<!--spring Validation校验--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.0.Final</version> </dependency> <dependency> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> <version>3.1.0.CR2</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency>
参考资料:
http://www.cnblogs.com/liukemng/p/3738055.html
在写配置文件的时候虽然idea提示是红色的,但是无妨,还是可以或获取得到的。对其忽略就行
那么我们的后台校验也已经完成了。
还有需要做校验的就是,如果用户已经注册过了,我们就不能让它再注册了。为了达到更好的用户体检,在提交表单前使用ajax来做校验就行了
//邮箱去做后台唯一性校验 submitHandler: function (validator, form, submitButton) { var $email = $("#userEmail").val(); console.log($email); $.ajax({ url: path + "/user/validateEmail.do", type: "post", async: false, data: { "userEmail": $email }, success: function (responseText) { if (responseText == "noEmail") { validator.defaultSubmit(); sweetAlert("请到您指定的邮箱完成激活"); } else { sweetAlert("您的邮箱已注册过了"); } }, error: function () { sweetAlert("系统错误!"); } }); }
做这个唯一性校验其实就是比对数据库有没有该条邮箱的记录罢了。
在寻找资料的时候发现了sweetAlert这么一个组件,发现比浏览器自带的alert要好看得多。因此又去下载来用了。值得一提的是,我使用的环境是windows下载zip的方式,在官网下载的css文件是自带有错的。后来还是去上面我说的那个网站直接找出它的css和js文件就好了。
资料如下:
http://mishengqiang.com/sweetalert/
效果如下:
搞了那么久,就剩下入数据库了。
/** * 先对数据进行校验,再注册 * * @param user * @return * @throws Exception */ @RequestMapping("/register.do") public String register(@Validated User user, BindingResult bindingResult) throws Exception { //如果参数不对,就直接返回注册页面 List<ObjectError> allErrors = bindingResult.getAllErrors(); if (allErrors != null && allErrors.size() > 0) { return "redirect:/goURL/user/toRegister.do"; } //对密码进行加密md5(密码+salt)后才存到数据库中 userService.encryptedPassword(user); userService.insert(user); //提示用户发送了邮件,让用户激活账户 String url = getProjectPath() + "/user/activate.do?userId=" + user.getUserId(); emailService.sendEmail(user, "注册", url); return "redirect:/common/countDown.html"; }
首次插入进数据库的时候,激活码默认值是0,还有uuid生成
<!--insert被自定义了。--> <insert id="insert" parameterType="zhongfucheng.entity.User" > <selectKey keyProperty="userId" order="BEFORE" resultType="string"> select uuid() </selectKey> insert into table_user (user_id, user_nickname, user_password, user_email, acti_state, acti_code, salt,token_exptime) values (#{userId}, #{userNickname,jdbcType=VARCHAR}, #{userPassword,jdbcType=VARCHAR}, #{userEmail,jdbcType=VARCHAR}, 0, uuid(), #{salt},now()) </insert>
对密码加密也很简单:生成一个随机数作为salt,使用md5(用户传递进来的密码+salt)
发送邮件就涉及到了javaMail了,javaMail之前是没有接触过的。于是就去找了几篇资料:
http://www.cnblogs.com/leechenxiang/p/6367432.html
http://www.cnblogs.com/codeplus/archive/2011/11/03/2232893.html