谈谈java做登录那些事

 前言:

  最近要给自己的网站模板写一个登陆功能,其他功能已经写了一半了,我觉得可以写个登陆整合一下了。

先来说说登陆流程(简化):

  客户端(输入账户密码)————》服务器端接收到账户密码(参数验证正确)————》响应回给客户端

出现了一个问题:登陆页面登陆成功了是没问题,但其他页面的接口我怎么知道正在浏览网站的人登没登陆成功?因为有些页面是要给登陆之后的用户看的,没登陆的用户不能看,所以整个网站每个页面都要做是否登陆处理,那么拦截器就用到了(好了,拦截器先按下不表)。

有以下几种方法来处理是否登陆验证问题:

  1、cookie

    cookie是在服务器上生成,发送给客户端浏览器,然后浏览器把cookie以k,v格式保存到客户端某个目录下的文件内。

    具体实现是这样的:

      客户端传入账户密码参数,服务器端login接口验证参数,账户密码都正确,把userId或一些登陆成功后用户的信息存到cookie中返回给浏览器,浏览器保存在本地文件。然后客户端访问其他页面url,再将该cookie的信息发送给服务器,服务器再来检验此cookie里面的信息,来判断用户是否登陆。

    弊端:(那么问题来了)

      1、单个cookie保存的数据不能超过4k,很多浏览器都限制一个网站最多保存20个cookie

      2、安全隐患:cookie里面的信息使用明文传输,如果cookie被人拦截,就可以拿到cookie里面的信息。就算cookie里面的信息加了密,人家直接将cookie里的信息直接请求接口也是一样的。别人还可以从本地保存的cookie的文件里拿cookie信息

      3、有些浏览器会禁用cookie或不支持cookie

  2、session

    具体实现跟cookie一样,只是把登陆信息放session里。

    弊端:

      1、session是保存在服务器上的,人数访问量一多,服务器性能就下降了。

      2、web服务器做负载均衡,下一个请求到另一台服务器时session就会丢失。

  3、token(令牌)

    token从字面意思就能理解,令牌嘛就像一个身份证ID。

    具体实现:

      1、账户密码验证正确后,生成一个加密的token字符串,然后把token返回给客户端。(一个简单的token算法:userId + time(当前时间戳) + sign(签名),然后再用加密算法生成一个十六进制的字符串,加密token是为了防止别人拼接token请求服务器)。

      2、然后,浏览器收到返回的token之后,把token存储在Local Storage中(通过js代码写入Local Storage,要用的时候再用js获取,并不会像cookie一样自动携带)。

      3、当浏览器登录后再访问其他的页面,请求url的时候会把token参数传过来,服务器对传来的token参数解密,匹配token中的令牌是否正确,正确则通过认证。

      4、这样就解决了session的弊端,不用去考虑用户在哪台服务器登录。

      (目前打算使用redis,把一些要登陆验证的参数放redis里面)

使用token可以用:JWT插件

猜你喜欢

转载自www.cnblogs.com/spll/p/10333402.html