您的位置:首页 > 其它

Session原理解释,为什么使用session

2018-01-19 09:32 260 查看


Cookie的作用

之前的一篇博客已经介绍了Cookie是用来记录服务器和客户端的状态,或者说记录用户的登录信息。 

我们的HTTP是无连接的,所以我们需要Cookie来进行用户和连接信息的记录。 

利用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删除时间 

1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Ses
b353
sion超时的最大时间。 

2)程序调用HttpSession.invalidate() 

3)服务器关闭或服务停止

关于SessionID 

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 存到数据库中

这里有个问题,当服务器遇到大量并发请求的时候怎么解决生成的session_id不重复的问题?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐