会话状态内容session和cookie

版权声明:未经允许不得随意转载,著作权归__盛某人所有 https://blog.csdn.net/NaXieNianWoMenYiQ/article/details/87875290

问题产生的原因:
HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的,浏览器的每一次请求都是完全孤立的

解决的方案:
作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态

会话和会话状态的概念:

会话:WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。会话的开始就是客户端和服务器建立连接,会话的结束是用户关闭整个web应用
会话状态:web应用的会话状态是指服务器与浏览器在会话过程中产生的状态信息,借助会话状态,web服务器能够把属于同一会话中的一系列请求和响应过程关联起来,使得他们之间可以相互依赖和传递信息。例如在一个购物网站购买东西,结算时必须知道登录请求表单的结果,以便知道是哪个账户在操作。还必须知道已选商品的信息。其中的用户登录的账户信息和已选商品信息就是会话的状态信息。

有状态会话的实现:这需要浏览器对其发出的每个请求消息都进行标识:属于同一个会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称之为会话ID(SessionID)。

这就是session和cookie的由来这两种机制又称为会话跟踪

Cookie机制

cookie机制采用的是在客户端保持 HTTP 状态信息的方案 。

Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。

一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器。

底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。

一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,其中允许每个站点最多20个Cookie,每个Cookie的大小限制为4KB。

Cookie的传送过程示意图
在这里插入图片描述
Cookie类常用的方法:

  • public Cookie(String name,Stringvalue)构造方法 创建Cookie对象

  • getName()方法;

  • setValue与getValue方法

  • setMaxAge与getMaxAge方法 设置最大时效

  • setPath与getPath

Cookie的使用

  1. 首先创建对象Cookie cookie=new Cookie(name,value);注意name和value只能是字符串

  2. cookic.setMaxAge(n);n的单位是秒,不设置setMaxAge默认情况下退出浏览器cookie就被删除了,若希望cookie保存在磁盘上那么就设置,设置为0则是命令浏览器删除该cookie。默认值为-1,即只保存到浏览器的缓存中,不保存到文件中,即浏览器关闭则会删除cookie

  3. 放入http响应报头,需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头。response.addCookie(cookie);

  4. 服务器获取cookie,Cookie[] cookies=request.getCookies();需要遍历根据名字查找

※存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。不同浏览器直接不能共用,因为不同浏览器保存的位置不一样
※cookie不能存中文,所以要使用编码和解码,编码使用URLEncoder.encode(name, “utf-8”);解码使用URLDecoder.decode(cookie.getValue(), “utf-8”);

Session机制

session机制采用的是在服务器端保持 HTTP 状态信息的方案 。

当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即JSESSIONID)
如果已经包含一个JSESSIONID则说明以前已经为此客户创建过session,服务器就按照JSESSIONID把这个session检索出来使用。
如果客户请求不包含JSESSIONID,则为此客户创建一个session并且生成一个与此session相关联的JSESSIONID,这个JSESSIONID将在本次响应中返回给客户端保存。

在这里插入图片描述
session的机制原理

**1. 当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,当用户第一次使用session时(表示第一次请求服务器),服务器会创建session,
并创建一个Cookie,在Cookie中保存了session的id,发送给客户端。这样客户端就有了自己session的id了。但这个Cookie只在浏览器内存中存在,也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了sessionId

2.当用户第二次访问服务器时,会在请求中把保存了sessionId的Cookie发送给服务器,服务器通过sessionId查找session对象,然后给使用。也就是说,只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象。这样也就可以让多个请求共享同一个session了。

3. 当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了sessionId,那么服务器会创建一个session,再把sessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。

4. 当用户打开某个服务器页面长时间没动作时,这样session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到session对象了,那么服务器还是会创建一个新的session对象,再把新的sessionId保存到客户端。这也是一个新的会话开始了。**

在这里插入图片描述

关于session的创建和删除问题:

创建:
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true) 或者 HttpServletRequest.getSession()这样的语句时才会被创建。

※getSession():如果当前已经创建了session则为这个用户则直接返回这个sesoin的对象。如果没有则创建一个新的。

删除
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间(tomcat服务器默认30分钟)
C.服务器进程被停止
注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

关于seesion有效时间的设置方式

会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。 
	<session-config>
		<session-timeout>30</session-timeout>
	</session-config>

session的方法

  • public void setAttribute(String name,String value)设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。
  • public Object getAttribute(String name)在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
  • public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
  • getAttributeNames方法获取一组属性的名
  • public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
  • public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
  • public int getMaxInActiveInterval(),获取会话的最大持续时间,使用时候需要一些处理
  • getServletContext方法:获取当前web应用
  • setMaxInactiveInterval方法:
    要使当前会话时间维持1小时,应在 setMaxInactiveInterval() 中填多少?
    解答:3600
    setMaxInactiveInterval(int i) i的单位是秒。

如果设置的值为零或负数,则表示会话将永远不会超时。常用于设置当前会话时间。

  • getMaxInactiveInterval方法
    获取会话维持时间
  • getLastAccessedTime方法:
    最后访问时间
    Date creationTime = new Date(session.getLastAccessedTime());
  • getCreationTime方法:
    返回SESSION创建时间,从1970年1月1号凌晨开始算起,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
    Date creationTime = new Date(session.getCreationTime());
  • isNew方法:
    session.isNew( )方法的意思是判断session是否为新建立的

关于HttpServletRequest接口中的Session方法:

  • getSession方法:获取session
  • isRequestedSessionIdValid方法:
  • isRequestedSessionIdFromCookie方法
  • isRequestedSessionIdFromURL方法
    在这里插入图片描述

Cookie和Session的联系和区别

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

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

5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

猜你喜欢

转载自blog.csdn.net/NaXieNianWoMenYiQ/article/details/87875290
今日推荐