7、会话跟踪(重点)

一、什么是会话跟踪

HTTP协议本身是基于请求/响应模式的,无状态的协议。也就是说,当客户端的请求到来,服务器端做出响应之后,连接就被关闭了。用户活动在发送多个请求和响应之中,作为web服务器来说,必须采用一种机制唯一的标识一个用户,同时记录该用户的状态

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

  1. Session技术:会话数据保存在服务器端
  2. Cookie技术: 会话数据保存在浏览器客户端。

二、Session

session保留在服务器内存中

1、概要

session 机制是⼀一种服务器端的机制,服务器使⽤用⼀一种类似于散列列表的结构 (也可能就是使⽤用散列列表)来保存信息。

当程序需要为某个客户端的请求创建⼀一个 session 的时候, 服务器首先检查 这个客户端的请求⾥是否已包含了⼀个 session 标识 - 称为 session id ,如果 已包含一个 session id 则说明以前已经为此客户端创建过 session ,服务器就 按照 session id 把这个 session 检索出来使⽤用(如果检索不到,可能会新建一 个),如果客户端请求不包含 session id ,则为此客户端创建一个 session 并 且⽣成一个与此 session 相关联的 session id ,session id 的值应该是⼀个既 不会重复,又不容易被找到规律以仿造的字符串,这个 session id 将被在本次 响应中返回给客户端保存.

2、如何在客户端保存有三种方式

  1. 通过cookie保存(有可能被用户禁用)
  2. 隐藏在表单中保存
  3. 重定向保存

3、获取session

/**
 *返回此次请求相关联的Session,如果没有客户端分配Session,则创建一个新的Session
 */
HttpSession session = HttpServletRequest.getHttpSession();
/**
 *返回此次请求相关联的Session,如果没有客户端分配Session,当create为true,创建一个新的
 *Session,如果create为false,返回null
 */
HttpSession session = HttpSession.getSession(boolean create);

4、常用API

返回值 方法名 说明
void setAttribute(String name,Object val) 保存信息
Object getAttribute(String name) 读取信息
Enumeration getAttributeNames() 获取所有session中的name
void removeAttribute(String name) 移除对应的信息
long getCreationTime() 获取Session创建的时间
String getId() 返回分配给Session的唯一标识符
long getLastAccessedTime() 返回客户端最后一次发送与Session相关的请求的时间
long getMaxInactiveInterval() getMaxInactiveInterval() 返回以毫秒为单位的最大间隔时间,这个时间是Servlet容器在客户的两个连续请求之间保持Session打开的最大时间间隔,如果超过这个事件,Servlet容器将使Session失效
void setMaxInactiveInterval(int interval) setMaxInactiveInterval(int interval) 如果设置一个负值,表示Session永远不会失效
ServletContext getServletContext() 返回Session所属的ServletContext对象
void invalidate() invalidate() 使会话失效

5、使用步骤

  1. 实例化Seesion对象
    //获取session对象,不存在则自动创建一个,默认是ture
    HttpSession session = req.getSession();
    //创建或得到session对象。如果得不到session对象,创建 新的session对象。主要是用于创建session对象的。
    HttpSession session = request.getSession(boolean create)
    
  2. HttpSession作为域对象保存会话数据
    //保存数据
    void setAttribute(java.lang.String name, java.lang.Object value)
    //得到数据
    Object getAttribute(java.lang.String name)
    //清除数据
    void removeAttribute(java.lang.String name)
    

6、生命周期

  1. session对象什么时候创建?
    执行request.getSession()方法时
    
  2. session对象什么时候销毁?

    默认情况下,session对象在30分钟之后服务器自动销毁。

    手动设置session有效时长 void setMaxInactiveInterval(int interval) -以秒为单位

三、cookie

image

1、概要

一种会话数据管理技术,该技术把会话数据保存在浏览器客户端

Cookie具有不可跨域名性

Cookies 是一中由服务器发送给客户的片段信息,存储在客户端浏览器的内容中或硬盘上在客户随后对该服务器的请求中发回它,Cookies以键值对的形式记录会话跟踪的内容,服务器利用响应报头 Set-Cookie来发送Cookie信息,在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID。由于涉及隐私权和安全性方面的问题,用户在使用浏览器时,可以选择禁用Cookie,web服务器就无法利用Cookie跟踪用户的会话了,要解决这个问题需要重写URL服务器可以根据Cookie来跟踪客户状态,这对于需要区别客户的场合(如电子商务,推荐等功能)特别有用

2、cookie的构成

Cookie 的内容主要包括

  1. 名字
  2. 过期时间
  3. 路径和域
    1. 域和路径的主要作用限制cookie的使用范围
    2. 域指的 baidu.com
    3. 路径就是跟在域名后面的 URL 路径,比如 / app /login 等等

3、API列表

序号 方法 & 描述
1 public void setDomain(String pattern)该方法设置 cookie 适用的域,例如xxx.com。
2 public String getDomain()该方法获取 cookie 适用的域,例如 xxx.com。
3 public void setMaxAge(int expiry)该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4 public int getMaxAge()该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5 public String getName()该方法返回 cookie 的名称。名称在创建后不能改变。
6 public void setValue(String newValue)该方法设置与 cookie 关联的值。
7 public String getValue()该方法获取与 cookie 关联的值。
8 public void setPath(String uri)该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9 public String getPath()该方法获取 cookie 适用的路径。
10 public void setSecure(boolean flag)该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11 public void setComment(String purpose)设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12 public String getComment()获取 cookie 的注释,如果 cookie 没有注释则返回 null。

4、使用

1、工作流程
  1. 首先浏览器向服务器发出请求。
  2. 服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。
  3. 然后把该Cookie对象放在响应头,一并发送回浏览器。
  4. 浏览器接收服务器响应后,该Cookie保存在浏览器端。
  5. 当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器
  6. 服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。
2、Cookie操作
  1. 写Cookie
    1> 实例化cookie对象
      Cookie cookie = new Cookie("user", "xiaozhang");
    2> 添加进响应发送给客服端
      resp.addCookie(cookie);
    3.当servlet向客服端写cookie的时候,可以通过Cookie类的setMaxAge(int expiry)来设置cookie的有效期,下面是参数说明
      3.1> 如果expiry > 0,就指示浏览器在客户端硬盘上保存Cookie的时间为expriy秒。
      3.2> 如果expiry = 0,就指示浏览器删除当前Cookie。
      3.3> 如果expiry < 0,就指示浏览器不要把Cookie保存到客户端硬盘。Cookie仅仅存在于当前浏览器进程中,当浏览器进程关闭,Cookie也就消失。
      3.4> Cookie默认的有效期为-1。对于来自客户端的Cookie,Servlet可以通过Cookie类的getMaxAge()方法来读取Cookie的有效期
    
  2. 读写客服端Cookie
       通过HttpServletRequest对象
       Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    //获得cookie的key
                    String name = cookie.getName();
                    // 获得cookie对应的name的值
                    String value = cookie.getValue();
                    //获得cookie的有效期
                    int maxAge = cookie.getMaxAge();
                }
            } else {
                System.out.println("没有cookie");
            }
    
  3. 修改cookie
    Cookie updateCookie = null;
    Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if (cookie.getValue().equals("xiaoming")) {
                       //修改Cookie的值
                        cookie.setValue("laowang");
                    }
                }
            }
     if (updateCookie != null) {
                    //通过响应添加返回给客服端
     }
    
  4. 删除cookie
    cookie.setMaxAge(0);
    

四、其它

1、Cookie和Session的区别:

  1. Cookie中只能保存ASCII字符串,Session中可以保存任意类型的数据,甚至Java Bean乃至任何Java类、对象等
  2. 隐私策略不同。Cookie存储在客户端,对客户端是可见的,可被客户端窥探、复制、修改。而Session存储在服务器上,不存在敏感信息泄露的风险
  3. 有效期不同。Cookie的过期时间可以被设置很长。Session依赖于名为JSESSIONI的Cookie,其过期时间默认为-1,只要关闭了浏览器窗口,该Session就会过期,因此Session不能完成信息永久有效。如果Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。
  4. 服务器压力不同。每个用户都会产生一个session,如果并发访问的用户过多,就会产生非常多的session,耗费大量的内存。因此,诸如Google、Baidu这样的网站,不太可能运用Session来追踪客户会话。
  5. 浏览器支持不同。Cookie运行在浏览器端,若浏览器不支持Cookie,需要运用Session和URL地址重写。
  6. 跨域支持不同。Cookie支持跨域访问(设置domain属性实现跨子域),Session不支持跨域访问
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,002评论 6 542
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,400评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,136评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,714评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,452评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,818评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,812评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,997评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,552评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,292评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,510评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,035评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,721评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,121评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,429评论 1 294
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,235评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,480评论 2 379

推荐阅读更多精彩内容