发表于: 2017-12-08 22:47:12
1 798
今天完成的事情:生成Token,放入Cookie中,拦截器里通过Cookie中判断Token的有效性来判断用户是否登录。
明天计划的事情:修改Task4中的两个页面,一个设为用户不登录可以访问,一个设为用户必须登录才可以访问。要求用户必须登录才能访问的url统一增加前缀 /u/。
遇到的问题:我理解的session和cookie和实际可能不太一样,卡了很久
收获:熟悉各种加密,拦截器配置
token是什么?为什么要用token?
传统身份验证的方法
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
看师兄日报把token存在数据库里,我在网上看到这样的话每次需要连接数据库验证token,和验证用户名密码无异,影响速度,
首先写登陆成功生成token,然后写登录判断token
下面是看师兄学到的,写一个cookie工具类,用来判断cookie是否存在
这是我的登陆页面
登陆成功后,我的url是checked,右边有个钥匙显示我保存了密码
返回到登录页面,自动登录了
使用md5,加盐
http://blog.csdn.net/dingsai88/article/details/51637977
这么看的话,因为加盐是随机的,注册时的salt和登录时的salt可以认定不一样,因此在注册的时候就需要生成盐值插入到数据库中,然后再登陆的时候调取盐值,生成md5加盐加密了的密码,再去和数据库的密码判断
可是感觉有些矛盾。当登录的时候,必须得到用户的盐值才能md5加盐加密用户输入的密码来验证用户的密码是否正确,可是用户还未验证用户名和密码是否正确,我又怎么去查询他的盐值?
那么只能根据用户输入的用户名(用户名不能重复)查询到盐值,然后md5加密用户输入的密码,再来验证用户名密码是否正确
...
思路:登录:
根据用户输入的用户名des加密查询密码,如果没有,提示用户名密码输入错误;如果有则继续:
取出其中的盐值,然后和md5一起加密密码,用用户名和密码查询是否数据存在(密码输入是否正确)。如果没有,提示用户名密码输入错误;如果有则说明用户名密码正确,跳转页面;
注册:
首先根据用户名查询数据是否存在,存在则提示用户名已存在;不存在则注册
一个加盐这么麻烦,五十多行代码,在网上也没看到相关例子,想到老大说的重构,一个方法二三十行代码就够了,,
就以上代码来看,token不过是一个字符串,实际实现自动登录的东西还是cookie
然后弄拦截器。拦截器是什么?
http://www.sohu.com/a/128772280_523754
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
需要实现的方法
preHandler : 是controller的前置方法,当方法返回false整个请求就结束了。多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在。
WebRequestInterceptor和HandlerInterceptor的preHandler的方法的区别就在与webRepuestInterceptor的preHandler的方法是没有拦截的功能,是没有返回值的。
postHandle : 就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。
afterHandler:该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行,可用于清理资源。
继承HanderInterceptor接口,实现他的方法
在配置文件引入拦截器
逻辑写在preHandler 里面,很明显我要先判断是否用户登陆过再判断页面是否呈现
执行,所有页面都是一片空白,登录页面也被拦截了
...
终于成功了,因为我没有加session。
然而登陆报错
,百度搜索这个看到了不能有逗号之类的东西,突然想起师兄日报里写到cookie不能有逗号。我把#作为用户名和密码的分隔符就好了
自动登录功能我觉得用cookie或session判断都可以
禅道:http://task.ptteng.com/zentao/my-task.html
评论