为了账号安全,请及时绑定邮箱和手机立即绑定

浅谈登录

标签:
Java

图片描述

1. 登录

会话
在计算机科学领域来说,尤其是在网络领域,会话(session,Microsoft Windows 中文版译作工作阶段)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。

上述会话的解释来自维基百科,我来谈谈我对会话的理解,首先,是网站证明用户属于自己网站的注册用户,并且已经完成验证的证明,这个证明包括:

  1. 用户信息
  2. 有效时间

在以前我自己写网站代码的时候,我其实不是很理解登录之后会有什么变化,就是我在网站输入了我的账号密码后,这个网站会有什么变化,在以前的文章上,我实现过登录注册的功能,但是一直不是很理解,现在我理解了,其实就是为了让网站统一认识你,认识已经登录过的你。
举个例子,现在的浏览器都支持标签页,也就是同一个浏览器可以打开不同的网址,那么当我打开同属于一个网站的两个网页的时候:
图片描述
图片描述
对于这两个页面来说,如果有一个页面登陆,另一个页面也应该是登陆的,也就是意味着,这里俩页面要共享一个参数。

  • 假设只使用数据库

假设只使用数据库来保存登陆的信息,有这样一个表,如果有人登陆了账号,就向这个数据库插入一条数据,另一个页面在访问后端的时候,查到了这个表的这一条数据,就发现登陆了,就返回登录的信息,这样说来,貌似没有什么不妥。
但是承担登录信息的压力就全都靠服务器数据库来保持,压力会有点不均衡。
那有没有一种方式,证明你登录过,可以在两个页面之间共享就可以了。这就是Session的出现。

  • 如何验证登录

我还记得以前用Java写代码的时候,直接用

select * from user where account='accountStr' AND password='passwordStr'

但是这样写的问题是,如果有人使用

1 OR 1

恶意的登录,是可以登录的,不相信的亲们可以试试。
所以验证密码的时候,先查询出密码,再判断密码是否一致,这样那个"1 OR 1"就无效了,当然这是针对以前的烂代码说的。

2. 会话 session

其实没那么神秘,就好像我们平时要组织一场会议,总要有会议的时间、地点、内容、主持人这几个因素。

  • Session保存在服务端
    也就是不在我们每个人使用的浏览器那儿,而是你访问的网站公司的服务器那里。

这也就是我们很平常的记录登录的方式,当服务器验证完之后,我们给客户端返回登录的用户名,用户ID,于是我们的网站上就会显示我的登录名,当我点击个人中心时,通过用户ID访问数据库,返回个人信息,就会显示我们的个人信息具体内容。
服务器会给这个session加上一个时间,到期后服务器会销毁这个session,当我们再次点击个人中心的时候,或者刷新页面的时候,发现这个session不存在了,于是就返回登录过期的信息,需要用户重新登录。

3. Cookie

其实就是为了区分session,并方便session的一种方式,比如你前一天登录过了,第二天想登录的时候,我不想再次输入账号密码了,于是浏览器可以查找cookie顺便帮你填了。

  • Cookie存在客户端

4. Token

就是令牌,主要是为了登录之后的事情服务,就好像参加一场会议,你会携带你的工作牌一样,当门卫检查工作牌的时候,需要检测
a)你是不是参加这次会议的人(登录名密码是否匹配在数据库)
b)是否在规定时间内参加(令牌是否过期)
如果你随便拿了一张纸,那么上述两条就都不用检测,直接拒你在门外就好了。

  • JWT
    JSON Web Tokens 又称 JWT。其实只是加密后的,已经被验证过的令牌(一串字符串)
    可以通过引入JAR包来使用(以下为maven管理)
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>

使用这种技术确实可以方便登录,而且可以用于验证权限,用于控制会话,但是也存在风险,例如:

  1. 无法单方面销毁,因为我们的代码通常都是讲token存在 Local Storage 当中。
  2. 安全泄漏,虽然token会过期,但是过期的了token仍然存在,而且这个token可能是admin权限

token自身存在一个时效,到期后会自动过期,你在访问都端的时候,会自动出现过期,过期后,客户端的代码就会判断这个token无效,这时客户端的前端代码就可以将过期的token清除

getAuthList() {
      axios.get('/apiUrl/').then(this.handleAPISucc)
        .catch(function() {
          window.sessionStorage.clear()
        })

上述代码就是通过axios的异常来判断是否过期,或者无效的情况,直接清除session即可。

总结

我以前只会使用session,现在尝试了token以后,发现token的使用感觉上很高大上,所以正在尝试,目前还没有特别深刻的业务需要,还需要后续完成各类开发,总结经验。token确实很神奇,我之前还在想如何把时效性放在token字符串里,想自己造轮子,没想到,早就有别人封装的工具了。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
30
获赞与收藏
154

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消