Cookie的作用
Cookie是用来记录服务器和客户端的状态,或者说记录用户的登录信息。
我们的HTTP是无连接的,所以我们需要Cookie来进行用户和连接信息的记录。
利用cookie我们就可以跟踪用户了
- 在HTTP响应报文中有一个cookie的首部行Set-Cookie
- HTTP请求报文中有一个cookie的首部行,每次请求都会加上这个cookie
- 客户端保存一个cookie,用户浏览器管理
- web站点服务器有一个数据库,当服务器解析接收到的请求报文中的cookie时就可以根据这个cookie中的值来判断是哪个用户或者说是哪个id,然后如果需要返回特定的信息就去数据库中获取然后返回给客户端。
Cookie的问题
我们单纯使用cookie来做用户认证,其实是非常大风险的。 因为服务器没有什么手段来判断这个cookie是不是我们的真实用户说发送的,很多第三方可以获取到这个cookie,里面的信息就可以被它用来伪造HTTP请求获取我们服务器的数据了。
引入Session
session会话机制。
Session一般是指浏览器这个页面打开到关闭的这段时间。所谓的使用session机制其实就是不把用户信息存到浏览器(客户端)而是全部存到服务器上,我们只存一个被称为sessionid的值作为cookie存在浏览器端。
原理
Session原理是服务端端每一个session维护一份会话信息数据,客户端和服务端依靠一个全局唯一标识sesssion_id来访问会话信息数据。用户访问web应用时,服务端程序决定何时创建session。
对于Java后台来说
其实我们可以认为,Session是调用HttpServletRequest.getSession(true)这样的语句时才被创建。这里的Session就是一个Java对象了,提供给请求者使用。 服务器再次接受到请求的时候就会收到这个Sesssion_id,然后根据ID在内存中找到之前创建的session对象,提供给请求者使用。
Session一般放在内存中,一旦服务器重启或者进程停止就会被清空。设置了session持久化才能使得重启服务器都能拿到session。
Session删除时间
- Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
- 程序调用HttpSession.invalidate()
- 服务器关闭或服务停止
session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会将sessionID(实质是cookie)放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。
对于Java后台来说,session是一个容器,可以存放会话过程中的任何对象
安全
Session机制中,数据是存储在服务器上面,所以你不能伪造,你要获得这些数据就必须使用服务提供的sesssion_id,Cookie是保存在客户端的,安全性很难得到保证。
其实我们使用session的话session是不会因为浏览器的关闭而删除的。
关于session_id的时效性
一般来说我们用session保持持久连接,也就是用户登录认证通过后,保持对这个用户的识别。 但是我们这个登录必须设置一个时效,也就是说登录了一段时间后我们要求用户重新登录。
其实也就是设置cookie(session_ID)的有效时间,当超过时了这个session_Id就无效了,我们就要再次登录,再次输入认证信息,然后服务器接收这些信息再次生成一个新的session,并把用户认证的信息存入这个session。
一般session也是有有效期的,可能是用户主要销毁,比如登出操作,这个session就销毁了。
Session和Cookie过期的对比
首先Cookie过期
Cookie一般有两种,一种是不设置过期时间,浏览器关闭就过期,一种是设置过期时间,存在硬盘中,下次打开浏览器仍然存在。
注意一般来说,cookie过期的话,再次打开浏览器就会被删除了.
再者Session_id和session
Session的话其实主要看session_id,大部分的会话机制是利用session_id(也是cookie),如果cookie过期了也就是session_id过期了,那么显然服务器中的session也会结束生命周期(被销毁)。(如果浏览器没有删除cookie,你发送了一个过期的cookie,服务器需要判断然后就会拒绝你的请求)
Session过期
session自动失效:一般服务器也会设置Session的过期时间,一旦session过期了,就算客户端的cookie(session_id)没有过期,session照样会结束自己的生命周期。
SessionID如何产生,由谁产生,保存在哪?
创建:
服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。
sessionid生成算法
tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;
存储在内存中。
如何持久化? cookie memcache redis 存到数据库中