登录页面:
登录页面(没有注册)可以从网上下载一个简单模板,要修改的就是引用文件的路径。页面展示如下:
数据库准备:
在数据库中新建用户表,字段包括用户名和密码(两次MD5计算后的字符串),还有第二次MD5计算所用到的盐值。插入登录用户数据。
登录逻辑:
①为登录按钮设置点击函数;
②获取用户名和密码,利用js函数对密码+盐值(不是数据库中的盐值)计算md5值,将生成的md5值作为密码和用户一同提交给服务器进行验证。(ajax提交表单数据)
<script type="text/javascript">
$('#signup_btn').click(function(){
var pwd = $('#password').val();
var salt = 'bcia^7*W$Ebih^$87bi';//可自己设置
var pwdsalt = pwd+salt;
var password = md5(pwdsalt);//与后台规则一样,以便验证
//通过ajax请求提交表单数据(用户名和密码)
$.ajax({
url:"${App_Path}/do_login",
type:"POST",
data:{username:$('#username').val(),password:password},
success:function(result){
//如果返回成功 code=0
if(result.code==0){
alert("success");
//跳转秒杀商品列表
window.location.href="goods/to_list";
}else{
alert(result.msg);
}
}
});
});
</script>
③前端提交(POST)表单数据之后,后端进行验证
a.表单提交的数据data:username:135****1910,password:123456,通过URI(/do_login)找到对应的Controller,传入参数LoginVo的实例对象(LoginVo是封装属性username和password的类)。
b.判断用户名或密码是否为空,空的直接返回错误信息;
c.如果用户名存在,则对loginVo.password计算MD5值(盐值用到数据库中的),并将数据库中查询的密码进行比较。用户名和密码验证成功返回登录成功码0;
④登录成功或失败要么返回错误信息要么返回成功码,为了统一我们封装一个CodeMsg类
⑤当前端ajax提交表单得到服务器响应后,success:function(result)中result即为服务器验证用户名和密码后的响应信息。得到成功码,跳转秒杀商品列表页,否则提示用户错误信息。
进一步的考虑:
http是无状态的连接,在其他页面怎么判断用户是否登录以及登录的用户是谁,这里就要考虑到如何保持登录用户信息。
解决方案:
用户第一次登录后,服务器如果对用户信息校验成功,通过随机生成UUID当做token,以该token为key,登录用户user为value存入第三方缓存中,并在登录成功后将该token写入cookie中,每次浏览器发出请求都带着该token,服务器根据该token从第三方缓存中查询对应的用户信息。