1.先写数据访问层
数据库的登录凭证表结构,看表结构,然后再想怎么存
ticket是核心数据 是一个随机字符串,不重复的,唯一标识
status 状态 0 正常 1 过期
登录成功时,生成登录凭证,发送给客户端,这样可以记录登录的状态,让状态能在多个请求中连续,这里需要用到cookie
我们生成的登录凭证,最终需要生成一个key发送给客户端,让他记住,下次再提交给服务端能够识别你,但是登录凭证中,包含一些敏感的数据用户id 用户名,甚至密码,如果这些数据不能发送给客户端,要存到服务端,我们可以用session来存,或者存到数据库里面,这边存到mysql中,后面重构存到redis中
(1)首先实现登录凭证
根据数据库字段写实体类LoginTicket,封装表中数据,再写增删改查的逻辑
在dao中创建LoginTicketMapper接口,写插入凭证方法,查询方法,修改凭证状态(退出的时候,凭证应该失效,即更改状态 )
查询的关键是依据ticket来查,整张表依据ticket来设计的,ticket是凭证,是核心数据,我们最终要把ticket字符串发送给浏览器,让他保存,其他数据是我们服务端自己要存一份,或者服务端在数据库里面存一份,客户端用cookie存储了这个数据后,他再次访问我服务器的时候,会把这个ticket给我,我可以用这个ticket查到整个数据,就可以知道是哪个用户在登录,哪个用户在访问。
所以我们这个查询是以ticket为条件的查询
接下来是实现这个方法
之间的方法都是在mapper下新建一个配置文件写sql
第二种方法是在接口当中写注解,通过注解去声明方法对应的sql
方法是 举例 插入数据
@Insert({" "," "," "}) 注解是括号里面花括号,然后一个个字符串拼成sql
在每一行字符串后面加一行空格,这样拼sql的时候,两个之间有空格断开,防止出现问题
然后values(#{ }) values里面写表达式,表达式引用的是对象中的参数属性,注意sql中的条件
第一个对应的是userId属性 (实体类中定义的)
2.开发业务层
就要写支持登录的业务,登录的时候就要接收页面出入的条件,包括用户名,密码。。。
然后对账号密码进行验证,没有问题就成功了
还在UserService中写一个方法 返回值设置为map
(1)首先进行空值处理 账号,密码不为空
(2)合法性验证 先查库里账号有没有,如果有查看密码是否一致
以上都对的话,就是登录成功,就要生成 登录凭证
创建一个loginTicket实体往库里面存储值,凭证是一个随机生成字符串
然后往里面设置值,然后用存到数据库中
loginTicketMapper.insertLoginTicket(loginTicket);
登录凭证已经生成成功了,我们就要把凭证放进去,最终发给客户端,可以放整个LoginTicket对象,也可以放ticket字符串也是可以的,浏览器只要记住key,下次再访问浏览器的时候,把凭证给我,我去库里找,找到了一条与之对应的数据,我去看状态对,时间也对,就认为是登录成功的,而且我通过ticket还可以找到user_id是谁
这个表的作用类似于session,但是我们这边是用表存的
3.有了这个业务逻辑,我们就可以编写表现层逻辑
首先得写controller 写方法处理页面的请求
登录界面的话,有个表单传入账号,密码,验证码三个值,很直观
我们需要收到这三个值,然后提交给userservice做处理
收到值后,要么我们重定向到首页,要么错了之后,回到登录页面
controller 还在logincontroller页面中写
在后面增加一个能够处理这次请求的方法
(1)首先声明这次方法的请求路径,这里方法用的是POST,因为这是一个增加数据的行为,表单要提交数据给我,然后提交到库里面,根据表单提交方式不同,即使路径相同,也能区分开。
返回数据的时候,就要在方法里面把model也声明一下
页面传进来验证码,我们需要取到我们之前生成的验证码去比,用户打开页面生成的验证码放到哪里去了,放到了session里面,这个请求中,我们需要把验证码从session中取出来,因此会用到session,所以这里面把session申明好, HttpSession session,假如登录成功后,我们最终要把ticket发送给客户端,好让他保存,需要用cookie保存,所以创建cookie,还需要HttpServletResponse对象, HttpServletResponse response
首先判断验证码是否正确,验证码不对,则账号密码就不用看了,验证码直接在表现层就能看出来,业务层不管,业务层只管业务逻辑,账号密码对不对
先看验证码 从session中取出验证码,将验证码与用户传的code相比
code是用户输入的验证码
检查账号,密码
如果成功,重定向到首页,
登录成功的时候,把ticket取出来,发送给客户端,让客户端存,说白了就是给客户端发送一个cookie,带上这个ticket
先实例化一个cookie,他的key取名ticket 他的value是map.get("ticket").toString();
value就是我们从map中取到的一个结果,get的是一个对象,我们需要把他toString,因为cookie的key和value都必须是字符串才行
没有ticket,回到登录页面
4.设置页面
login.html
发送请求的时候的设置
找到表单的位置,首先声明表单提交给谁,采用post方式提交,提交的路径@{/login}
每一个框上加上name,跟我们controller方法的 参数一致
账号,密码,验证码,记住我
当发生错误的时候的设置 错误信息的展现
首先账号,旧的值还在,就加value,从request取参数得到
错误提示的显示,死的改成动态的
退出功能
业务层
加个退出的业务处理,将ticket改为无效
控制层
加一个请求,处理页面的请求
返回路径/logout, get
因为在页面上点击退出登录才触发退出登录,所以要配置好链接
所有的链接都是在index中配置的,然后复用
路径改成logout
到数据库看状态对不对