Java Web学习(五)认证机制三巨头--session、cookie、token

一、引言

  动态网页兴起后,会话管理变成开发者需要考虑的一个问题,由于HTTP请求是无状态的,为了区分每个用户,此时引入了会话标识(session id)的概念,但是存储机制也会产生不同的问题,下面就详细分析一下三种机制的优缺点以及使用方式。

二、session

定义:会话,打开web应用时产生,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。

创建:session在访问tomcat服务器时调用HttpServletRequest.getSession(true)创建。(此时对应的sessionid也同时产生)

存储:session的状态信息等储存在服务器的内存中,但是sessionid是保存客户端的cookie中,客户端不保存session,session销毁只能通过invalidate或超时失效,关掉浏览器并不会关闭session。

删除:(1)超时;

(2)程序调用HttpSession.invalidate();

(3)程序关闭;

存在的问题:(1)负载均衡后,每台机器间的session都需要相互复制,很烦杂

      (2)单独把session拿出来存,又会面临这台存session的服务器一宕机,全部的用户都得重新登陆,凉凉...

常见QA:

Q:浏览器关闭时,session会同时关闭么?

A:session并不会因为浏览器的关闭而删除!关闭浏览器和session失效没有任何关系, session本身有一个存活时间,在tomcat中默认的是30分钟,打个比方即使浏览器一直开着,如果在30分钟内没有发出任何请求, 那原来存在服务器上的session域内的东西就全没有了, 再次访问的时候,服务器会新建一个session。它的改变是通过session.getMaxInactiveInterval()改变的,当关闭浏览器,再打开浏览器访问的时候,服务器会新建一个session,可以通过session的ID来判断是不是新的session,session的失效除了上述的超时,还有调用invalidate() 或者服务器重启或者中断,所以如果当设置session的MaxInactiveInterval为-1(永不超时)时,并且关闭了浏览器,那么你的session会一直存在,除非重启服务器。

三、cookie

定义:由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到本地某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。

存储:保存在本地客户端

删除:(1)超时;(设置了过期时间,cookie过期后会存储在硬盘里面)

   (2)手动删除;

存在的问题:(1)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。

      (2)cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。

      (3)cookie有大小限制以及浏览器在存cookie的个数也有限制。

四、token

定义:令牌,是一种用户身份的验证方式。

创建:第一次登录后,服务器生成一个Token便将此Token返回给客户端

存储:token一般储存在客户端的cookie中,服务端生成后不保存token(可以存在缓存中),服务端处理每次请求,只做token的校验工作而已。

常见组成方式:uid(用户唯一的身份标识) + time(当前时间的时间戳) + sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。

验证流程:(1)用户通过用户名和密码发送请求。

     (2)程序验证。

     (3)程序返回一个签名的token 给客户端。

     (4)客户端储存token,并且每次用于每次发送请求。

     (5)再次请求时,服务端验证token并返回数据。

PS:第一次登陆时,客户端传账号和密码到服务器,服务器先去查询数据库,查询到用户信息后服务器再根据自己的规则生成token并缓存(如redis等技术),再把token回传给客户端(客户端可以把token存到cookie中)。

    第二次登陆时,直接传token给服务器验证缓存中是否存在该token;也可以传账号密码给服务器,让服务器再次生成一次token,用这次生成的token去缓存中校验是否存在。

原文地址:https://www.cnblogs.com/riches/p/11399123.html

时间: 2024-08-12 19:50:54

Java Web学习(五)认证机制三巨头--session、cookie、token的相关文章

java web 学习五(servlet开发1)

一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1.编写一个Java类,实现servlet接口. 2.把开发好的Java类部署到web服务器中. 按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet 二.Servlet的运行过程 Servlet程序是由WEB

Java Web 开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式.Cookie存储的数据量有限,且都是保存在客户端浏览器中.不同的浏览器有不同的存储大小,但一般不超过4KB.因此使用 实际上只能存储一小段的文本信息. 例如:登录网站,今输入用户名密码登录了,第二天再打开很多情

java web 学习路线

Java Web学习路线   Java分成J2ME(移动应用开发),J2SE(桌面应用开发),J2EE(Web企业级应用),所以Java并不是单机版的,只是面向对象语言.建议如果学习Java体系的话可以这样去学习:   *第一阶段:Java基础,包括Java语法,面向对象特征,常见API,集合框架: *第二阶段:Java界面编程,包括AWT,事件机制,SWING,这个部分也可以跳过,用的时候再看都能来及: *第三阶段:Java API:输入输出,多线程,网络编程,反射注解等,Java的精华部分:

JAVA Web学习篇--Servlet

Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中.假设是这样,除了负责显示的HTML标记之外,必须还要有完毕这些业务功能的代码存在.这样的网页我们就叫做动态网页. 对于静态网页而言,server上存在的是一个个纯HTML文件.当client浏览器发出HTTP请求时,server能够依据请求的URL找到相应的HTML文件,并将HTML代码返回给cl

Java Web学习(一) Eclipse与Tomcat配置

Java Web学习(一) Eclipse与Tomcat配置 一.Eclipse的选择 使用基于Eclipse的STS Ide ,个人感觉挺好用的. 地址:http://spring.io/tools/sts 根据以上两张图片,将STS 下载下来.然后解压缩. 用编辑器打开STS.ini 文件,在最后一行,添加    -Dfile.encoding=UTF-8 这样以后所有用STS 创建的文件都是UTF-8的编码了. 二.JDK与Tomcat的安装与配置 1.JDK安装与配置 地址: http:

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Java Web学习(二) Eclipse的配置

Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后根据windows系统32位或64位,进行选择(建议64位).如果你的机器内存过小,可以选择Eclipse的旧版本:Eclipse Indigo .Eclipse Juno . Eclipse Kepler 等版本. 2.解压缩安装 打开压缩包,将里面的Eclipse 拖出到指定位置,进行解压缩.

[原创]java WEB学习笔记95:Hibernate 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------