JavaWeb——会话技术Cookie & Session

会话技术

因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分不同的客户端)

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:

  • Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端 可以清除cookie
  • Session:将数据存储到服务器端,安全性相对好,增加服务器的压力

一、Cookie技术

Cookie技术是将用户的数据存储到客户端的技术。

1、设置cookie

Cookie cookie = new Cookie("username","x5456");     // 创建cookie对象

cookie.setMaxAge(10*60);     // 设置cookie有效期为10min,默认是到浏览器关闭时,设置为0清除cookie

cookie.setPath("/WEB16");   // 设置cookie携带路径,默认会将整个web应用(/WEB16)戴上cookie

response.addCookie(cookie);     // 将cookie中存储的信息发送到客户端

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里

cookie只能存除中文的字符串

2、获取指定的cookie

cookie信息是以请求头的方式发送到服务器端的

Cookie[] cookies = request.getCookies();    // 获取cookie列表

for(Cookie cookie : cookies){     // 遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
    if(cookie.getName().equals("username")){
        String cookieValue = cookie.getValue();
        System.out.println(cookieValue);
    }
}

3、清除cookie

Cookie c = new Cookie("name","");   // key为要清除的cookie

c.setMaxAge(0);

c.setPath("/WEB16");    // 路径要和之前一样

response.addCookie(c);

二、Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID

1、向session域中存取数据

session也是一个域对象,所以也可以用get/set/remove方法

/*
 * request.getSession()方法内部会判断 该客户端是否在服务器端已经存在session
 * 如果该客户端在此服务器不存在session 那么就会创建一个新的session对象
 * 如果该客户端在此服务器已经存在session 获得已经存在的该session返回
 */
HttpSession session = request.getSession();

session.setAttribute("name","x5456");   // 设置Session

String JSESSIONID = session.getId();    // 获取Session对象的编号id

Cookie cookie = new Cookie("JSESSIONID",JSESSIONID);    // 手动创建一个存储JSESSIONID的Cookie,为该cookie设置持久化时间

cookie.setPath("/WEB16");
cookie.setMaxAge(60*10);

response.addCookie(cookie);

2、获得Session中的值

HttpSession session = request.getSession();  // 获取域对象

Object name = session.getAttribute("name");

System.out.println( (String) name);

Session对象的生命周期

创建:第一次执行request.getSession()时创建

销毁:

1)服务器(非正常)关闭时

2)session过期/失效(默认30分钟)

时间的起算点:从不操作服务器端的资源开始计时

可以在工程的web.xml中进行配置过期时间

<session-config>

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

</session-config>

3)手动销毁

session.invalidate();

作用范围:
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象

原文地址:https://www.cnblogs.com/x54256/p/8450366.html