博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
会话和会话状态
阅读量:5093 次
发布时间:2019-06-13

本文共 3234 字,大约阅读时间需要 10 分钟。

一、会话概述

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

2)解决:借助会话状态,Web服务器能够把属于同一会话中的一系列请求和响应过程关联起来。

3)实现:需要浏览器对其发出的每个请求消息都进行标识。这个标识称为会话ID(SessionID)。

 

二、Cookie

1. 概述

1)机制:采用在客户端保持HTTP状态的方案。浏览器访问服务器时,由服务器在HTTP响应消息头中附带一个传送给浏览器的小文本文件。之后浏览器每次访问服务器时,都会在HTTP请求头中将这个 Cookie 回传给服务器。

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

 

2. 创建Cookie

方法签名:

  • Cookie(String name, String value)  //构造器
  • void setMaxAge(int maxAge)         //设置 Cookie 的最大时效, 以秒为单位。

                                                                   若为 0 , 表示立即删除该 Cookie;

                                                                   若为负数, 表示不存储该 Cookie;

                                                                   若为正数, 表示该 Cookie 的存储时间。

  • void addCookie(Cookie cookie)           //把Cookie加入到响应中
//1. 创建一个 Cookie 对象Cookie cookie = new Cookie("name", "atguigu"); //2. 设置 Cookie 的最大时效cookie.setMaxAge(30);            //3. 调用 response 的一个方法把 Cookie 传给客户端. response.addCookie(cookie);

 

3. 获取Cookie

方法签名:

  • Cookie[] getCookies()  //获得这次请求中的全部Cookie
  • String getName()         //获得当前Cookie的名字
  • String getValue            //获得当前Cookie的值
//1. 获取 CookieCookie [] cookies = request.getCookies();if(cookies != null && cookies.length > 0){    for(Cookie cookie: cookies){        //2. 获取 Cookie 的 name 和 value        out.print(cookie.getName() + ": " + cookie.getValue());    }}

 

4. Cookie的作用范围

1)默认范围:可以作用当前目录和当前目录的子目录. 但不能作用于当前目录的上一级目录。

2)解决方案:可以通过 setPath 方法来设置 Cookie 的作用范围, 其中 / 代表站点的根目录。

Cookie cookie = new Cookie("cookiePath", "CookiePathValue");//设置 Cookie 的作用范围:cookie.setPath(request.getContextPath());  response.addCookie(cookie);

 

三、HttpSession

1. 概念

1)含义:在Web开发环境中,session 是指一类用来在客户端与服务器之间保持状态的解决方案。有时候也用来指这种解决方案的存储结构。

2)机制:采用在服务器端保持HTTP状态信息。

3)原理:

  • 创建一个 session 时先检查这个客户端的请求里是否包含了一个 session 标识(即sessionID),即请求里是否存放了名为"JESESSIONID",值为 sessionID 的 cookie
  • 若已存在就检索出来使用,
  • 否则为此客户创建一个 session,并生成一个与此 session 相关联的 sessionID,用 set-cookie 方式传递给请求,那么下一次请求发出时,就会使用此 sessionID 作为 cookie 中名为"JESESSIONID"的值进行传递 sessionID。

4)保存方式:最常用的是用 cookie 保存。但如果 cokkie 被禁用,必须有其他机制进行保存。如URL重写:把 sessionID 附加在URL路径后面。

5)注意:由于是通常是用 cookie 来保存的,所以如果让 cookie 持久化就可以在重启浏览器后也能获取到该 sessionID。

//用持久化cookie保存sessionIDCookie cookie = new Cookie("JESESSIONID",session.getId());cookie.setMaxAge(20);response.addCookie(cookie);

 

2. Session的创建

1) Session 属性

  • 若 page 指定的 Session 属性默认为 true,那么 第一次访问一个 WEB 应用的一个 JSP 页面时,该页面都必须有一个和这个请求相关联的 Session 对象。
  • 否则JSP 页面不会要求一定有一个 Session 对象和当前的 JSP 页面相关联,所以第一次访问JSP页面时不会创建一个 Session。

2)request.getSession(boolean flag):

  • true,则一定会返回一个 HttpSession 对象,如果已经有和当前 JSP 页面关联的 HttpSession对象,直接返回;如果没有,则创建一个新的返回。
  • false,则若没有和当前JSP页面关联的 HttpSession 对象返回null,否则返回取得的HttpSession对象。
  • request.getSession() 相当于 request.getSession(true)。

 

3. Session对象的销毁

1)调用HttpSession 的 invalidate()方法。

2)HttpSession 超过过期时间自动销毁,可以在 Tomcat 的 web.xml 文件中配置 Session 的最大时效, 单位是分钟。

30

 

相关方法签名:

  • int getMaxInactiveInterval()                         //返回最大时效,单位:秒
  • void setMaxInactiveInterval(int interval)      //设置最大时效

3)服务器卸载当前 WEB 应用。

 

4.Session相关方法

String getId()                                                       //得到sessionID

boolean isNew()                                                  //该session是不是新创建的

long getCreationTime()                                       //该session被创建的时间

long getLastAccessedTime()                              //该session最后一次被访问的时间

void setAttribute(String key, Object value)         //存放值,相当于哈希表

Object getAttrbute(String key)                           //根据键从session中取得对应的值

 

5.URL重写实现Session跟踪

方法签名:String encodeURL(String url)  //该方法会在URL后面加上sessionID

 

转载于:https://www.cnblogs.com/CComma/p/7173167.html

你可能感兴趣的文章
可选参数的函数还可以这样设计!
查看>>
走高端树品牌 IT大佬竞相“归田”
查看>>
大型网站应用之海量数据和高并发解决方案总结一二
查看>>
[BZOJ4518][SDOI2016]征途(斜率优化DP)
查看>>
Android recycleView的研究和探讨
查看>>
HDU1024 Max Sum Plus Plus 【DP】
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
十六进制的ASCII码 "\u6cf0\u56fd" 解码成unicode
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
android中自定义下拉框(转)
查看>>
Android设计模式源码解析之外观模式(Facade)
查看>>
使用word发布博客
查看>>
构建oracle12c的Docker镜像
查看>>
用户权限命令(chmod,chown,umask,lsattr/chattr)
查看>>
Maven详解
查看>>
Linux系统中‘dmesg’命令处理故障和收集系统信息的7种用法
查看>>
数据结构 : Hash Table [II]
查看>>
面向对象的小demo
查看>>
获取地址栏参数
查看>>