JavaWeb基础学习(四)--Cookie & Session

版权声明:本文版权归宋坤所有,转载请注明出处 https://blog.csdn.net/skisqibao/article/details/82780897

会话状态管理

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

 

问题引入:

怎么才能实现网上购物:某个用户从网站的登录页面登入后,再进入购物页面购物时,负责处理购物请求的服务器程序必须知道处理上一次请求的程序所得到的用户信息。

 

如何解决:

作为 web 服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态,因此web服务器采用一种会话机制来解决这方面的问题。

 

会话和会话状态:

         Web应用中的会话一个客户端浏览器与web服务器之间连续发生一系列请求和响应的过程。

         Web应用的会话状态指web服务器与browser在会话过程中产生的状态信息。借助会话状态,web服务器能够把属于同一会话的一系列请求和响应过程关联起来

 

     如何实现会话:

Web服务器要想从大量请求消息中区分出哪些属于同一会话的请求消息,即识别来自同一browser的请求,需要browser对其发出的每个请求都进行标识,这个标识号就称为会话ID(SessionID)。

在Servlet规范中,常用两种会话跟踪机制:

  • Cookie
  • Session

 

Cookie机制

         cookie使用在客户端browser保持http状态信息的机制。

当浏览器访问web服务器资源时,web服务器在传送http响应消息头给browser时,在响应头中附加一个小文本文件,这个小文本文件中存储的就是cookie的相关信息。

         browser会保存cookie的信息,一旦browser保存某个cookie,那么在以后访问该web服务器时,都会在http请求消息头中将这个cookie的信息传给web服务器。

 

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

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

 

Cookie传送过程示意图

        Servlet中使用Cookie:

Servlet API中提供了一个javax.servlet.http.Cookie类来封装Cookie信息,它包含有生成Cookie信息和提取Cookie信息的各个属性的方法。

Cookie类的方法:

public Cookie(String name,String value) 构造方法,value不能为中文.

getName()方法

setValue()与getValue()方法

setMaxAge()与getMaxAge()方法 (用来设置Cookie的时效,即过期时间)

setPath()与getPath()方法

 

         使用Cookie的流程:

 

  1. 如果创建一个cookie,并将它发送到浏览器,默认下它是一个会话级别的cookie(另一个是持久级别的Cookie,下面介绍),存储在浏览器的内存中,用户退出浏览器之后被删除。
  2. 若希望浏览器将该cookie存储在磁盘上,则需要使用Cookie的setMaxAge(),并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  3. 发送cookie需要使用HttpServletResponse的addCookie()方法,将cookie插入到一个 Set-Cookie HTTP响应报头中。这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头。
  4. HttpServletRequest接口中定义了一个getCookies()方法,它用于从HTTP请求消息的Cookie请求头字段中读取所有的Cookie项,返回Cookie数组。

 

  1. 会话Cookie,不设置cookie的过期时间,只要浏览器关闭,cookie就消失,生命周期为浏览器会话期的Cookie称为会话Cookie。一般保存在内存而非磁盘中。
  2. 持久Cookie,设置过期时间,浏览器就会把cookie保存在磁盘上,关闭浏览器后再次打开,这些cookie仍有效,除非超过设定的过期时间。同时存储在硬盘上的cookie能被不同浏览器进程共享。

 

Session机制

         session使用的是在服务器端保持http状态信息的机制。

当服务端需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即JSESSIONID)

如果已经包含一个JSESSIONID则说明以前已经为此客户创建过session,服务器就按照JSESSIONID把这个session检索出来使用。

如果客户请求不包含JSESSIONID,则为此客户创建一个session并且生成一个与此session相关联的JSESSIONID,这个JSESSIONID将在本次响应中返回给客户端保存。

 

         过程示意图:

底层实现:

1. 当用户第一次使用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的创建

是在服务端程序(如Servlet)调用HttpServletRequest.getSession(true)或者HttpServletRequest.getSession()时,而非在客户端访问时被创建。

 

getSession():如果当前已经创建session对象,则直接返回这个sessoin对象;如果没有则创建一个新的。

getSession(true);如果不存在会话就创建一个新的会话(如果想把数据写入到会话中)
getSession(false):如果不存在会话就返回null(如果只是想读取会话中的数据)

当向Session中存取登录信息时,一般建议:HttpSession session =request.getSession();

当从Session中获取登录信息时,一般建议:HttpSession session =request.getSession(false);

 

         session的删除:

  1. 程序调用HttpSession.invalidate()
  2. 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间(tomcat服务器默认30分钟)
  3. 服务器进程被停止

注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

        

         session的超时管理:

  1. WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间内没有发出后续请求,WEB服务器则认为客户端已经停止活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
  2. 如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
  3. 会话超时时间间隔可在web.xml中设置,默认值(30min)由Servlet容器定义.

<session-config>

                  <session-timeout>30</session-timeout>

         </session-config>

 

       HttpSession接口中的方法:

  1. getId方法
  2. getCreationTime方法
  3. getLastAccessedTime方法
  4. setMaxInactiveInterval方法
  5. getMaxInactiveInterval方法
  6. isNew方法
  7. invalidate方法
  8. getServletContext方法
  9. setAttribute方法
  10. getAttribute方法
  11. removeAttribute方法
  12. getAttributeNames方法

 

HttpServletRequest接口中的Session方法:

  1. getSession方法 (之前已经介绍)

public HttpSession getSession(boolean create)

public HttpSession getSession()

  1. isRequestedSessionIdValid方法                     --请求session是否有效
  2. isRequestedSessionIdFromCookie方法        --请求session是否来自cookie
  3. isRequestedSessionIdFromURL方法             --请求session是否来自url

 

浏览器访问服务端的任何一个 JSP 或 Servlet,是否都会立即创建一个 HttpSession 

  1. 若当前的 JSP(或 Servlet) 是客户端访问的当前 WEB 应用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false, 则服务器就不会为 JSP 创建一个 HttpSession 对象;
  2. 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,则当前 JSP 页面会返回一个会话的 HttpSession 对象,而不会创建新的 HttpSession对象。
  3. 对于 Serlvet 而言:若 Serlvet 是客户端访问的第一个 WEB 应用的资源,则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HttpSession 对象。

 

 

 

 

猜你喜欢

转载自blog.csdn.net/skisqibao/article/details/82780897
今日推荐