发表于: 2017-12-08 22:47:12

1 799


今天完成的事情:生成Token,放入Cookie中,拦截器里通过Cookie中判断Token的有效性来判断用户是否登录。

明天计划的事情:修改Task4中的两个页面,一个设为用户不登录可以访问,一个设为用户必须登录才可以访问。要求用户必须登录才能访问的url统一增加前缀 /u/。

遇到的问题:我理解的session和cookie和实际可能不太一样,卡了很久

收获:熟悉各种加密,拦截器配置

token是什么?为什么要用token?

传统身份验证的方法

HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

基于 Token 的身份验证方法

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 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


返回列表 返回列表
评论

    分享到