接着上篇的Servlet总结,本篇文章来总结下 Cookie 和 Session
一、会话介绍
1、什么是会话?
从打开浏览器,到访问页面,到最终关闭浏览器 ,整个过程就是一次会话
2、会话的特性:
- 一个会话中可能包含多个请求
- 一次完整的会话只针对一个用户
3、会话管理技术:
- Cookie 技术:客户端技术
- Session技术:服务器技术
二、Cookie 技术:客户端技术
1、什么是Cookie?
- Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据。
- Cookie就是服务器保存在客户端的数据!(类似于会员卡,保存在用户手中(客户端))
- Cookie是一个键值对!
2、Cookie的常用用途:
- 站点跟踪特定访问者访问的次数,最后访问的时间以及访问者进入站点的路径;
- 帮助站点统计用户个人资料以实现各种各样的个性化服务。
- 实现自动登录功能
3、Cookie的执行原理:
- 第一次访问服务器,服务器会增加Set-Cookie头字段,将Cookie信息发送给浏览器,并保存在客户端。
- 当后续访问服务器时,会在请求消息中将用户信息以Cookie的形式发送给服务器,从而使服务器端分辨出当前请求是由哪个用户发出的。
类 javax.servlet.http.Cookie 表示cookie
获取Cookie信息的方法:
getName()名称, 
getValue()值, 
getPath()cookie所在的目录, 
getDomain()有效域 
getMaxAge()有效时间, 
getSecure()只能使用安全的协议设置Cookie信息的方法:
setValue(), 
setPath(), 
setDomain(), 
setMaxAge()设置在客户端硬盘上保存的最大时间,单位为秒从请求中获取Cookie:
 Cookie[] HttpServletRequest.getCookies( ) 向响应中添加cookie:
HttpServletResponse.addCookie("name","value")4、向客户端写入Cookie:
1、创建Cookie
Cookie c=new Cookie("name", "value");2、设置Cookie的属性
c.setMaxAge(60*60*24); 
c.setDomain("pdsu.edu.cn")
c.setPath("/")3、调用 response 的 addCookie 方法将其写入到客户端
response.addCookie(c)5、读取Cookie的步骤:
从客户端读取所有能够被本服务器读取的Cookie:
Cookie[] cookies=request.getCookies();从中找出需要的Cookie:
for(int i=0;i<cookies.length;i++) {
if( cookies[i].getName().equals(“wanted”) ){
      ......
   }
}例:使用Cookie对象实现欢迎信息,当用户第一次访问应用时显示欢迎信息,并提示第1次访问,依次类推。
代码如下:
package cn.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IndexServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies();
        Integer integer = 0;
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if ("A".equals(cookies[i].getName())) {
                    integer = Integer.parseInt(cookies[i].getValue());
                }
            }
        }
        integer++;
        Cookie cookie = new Cookie("A", integer + "");
        if (integer <= 1) {
            response.getWriter().append("欢迎A").append("首次访问本网站");
        } else {
            response.getWriter().append("欢迎A第").append(integer + "").append("次访问本网站");
        }
        cookie.setMaxAge(10);
        response.addCookie(cookie);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
三、Session技术:服务器技术
1、什么是Session技术?
- 一种会话管理技术,将会话中的数据保存到服务器端。
- 是基于会话级别的cookie实现的。
- 通俗的讲session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程,病人去医院看病,只需要出示就医卡,医生根据卡号可以查到病人的就诊信息。
- 当浏览器访问服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就医卡号,在后续访问时,只要将标识号传递给服务器,就能判断出是哪个客户端发送的,从而选择与之对应的Session对象为其服务, 通常情况下Session是借助Cookie技术来传递ID属性的。
2、Session实现原理:
图解:
- session中的数据可以被一个用户在一次会话中共享。 
- 每个人的session是不同的。  
 
- session_id的检索和创建:  
3、Session会话:
1、什么是会话跟踪技术?
- HTTP是无状态协议,也就是没有记忆力的协议,每个请求之间无法共享数据。这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。这说明需要使用额外的手段来跟踪会话!
- 在一个会话中共享数据即会话跟踪技术
2、会话追踪过程可划分为:
3、常用的会话追踪机制有:
- Cookies 
 特点:最常用
 原理:引擎把用户会话ID保存在cookie中,保存到客户端,在以后的请求中把这个cookie发送给服务器
- URL重写 
 特点:性能最低
 使用情况:客户端不能接受cookie时
 原理:把session id写入URL中,这样的URL会被引擎解析和某个session相关联
 例子:- http://www.myser.com/catalog/index.htm;jsessionid=1234
- 表单隐藏
 原理:利用HTML内hidden的属性,把客户端的信息,在用户不察觉的情形下,偷偷地随着请求一起传送给到服务器处理
 使用:<input type="hidden" name="userID" value="15">
 优点:session数据传送到服务器端时,不会将session数据暴露在URL之上
 缺点:用户直接观看HTML的源文件,session数据将会暴露无疑
4、会话追踪机制比较:

5、会话管理机制:
- 创建会话:
- HttpServletRequest的- getSession( )方法,若有会话则返回当前会话,没有则创建新会话
- getSession(true)和上面执行同样的功能。
- getSession(false)访问一个现有的会话、而不是新创建一个会话,如果没有合法的会话则返回null
例:
  HttpSession session=request.getSession(true)- 存储和访问会话属性:
- 标准会话属性包括:会话标识符、数据、创建时间、上次访问时间等,都以“名-值”对形式保存
- HttpSession提供了一种把对象存储到内存、在同一用户的后继请求中提取这些对象的标准办法
- 在会话中保存数据的方法:setAttribute(String s, Object o)
- 从会话提取原来所保存对象的方法: getAttribute(String s)
- 关闭会话:
1.显式关闭:HttpSession.invalidate( ) 
2.隐式关闭—会话超时(等待超时自动操作)
- 默认的超时时间间隔是1800秒
- 无效之前,可以使用setInactiveInterval(int seconds)方法在客户请求之间控制这个时间间隔。
- 设置负值可以确保会话永远不会超时
4、Session常用方法:
getAttribute()从session中获取以前存储的值
setAttribute()将键与值关联起来,存储进session
removeAttribute()删除session中存储的对应键的值
invalidate()删除整个session及其存储的键值
logout()注销当前用户
getId()获取每个session对应的唯一ID
getCreationTime()获取session创建的时间
getLastAccessedTime()获取session最后被访问的时间
getMaxInactiveInterval()在用户没有访问的情况下,会话在被自动废弃之前应该保持多长时间
getAttributeNames()返回session中所有属性的名称5、Session监听器:
作用:监听对象的动作(创建、销毁等)和状态
- 创建的新的session对象
- 销毁session对象
要实现session监听器, 需要实现 javax.servlet.http.HttpSessionListener 接口
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 2058751973@qq.com
 
            