java-Servlet-cookie and session
阅读原文时间:2023年07月08日阅读:1

1 状态管理

a) 什么是状态管理?
将浏览器与web服务器之间多次交互当做一个整体处理,并且将多次交互涉及的数据(即状态)保存下来.

b) 如何进行状态管理?

  1. 可以将状态保存在客户端
    将状态保存到浏览器这边,通常使用Cookie技术
  2. 将状态保存到服务器端(session 会话)

c) Cookie

  1. 什么是coolie?
    服务器为了识别用户身份临时存在浏览器端的少量数据.
  2. 工作原理
    浏览器访问服务器时,服务器将一些数据已set-cookie消息头的形式发送给浏览器.浏览器会将这些数据临时保存下来;当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式发送给服务器
  3. 添加cookie
    cookie c = new cookie(string name,string value);
    注:name:cookie名称 value:cookie值
    response.addCookie(c);

d) 读取Cookie
Cookie[] request.getCookies();
注:有可能返回null;
String cookie.getName();
String cookie.getValue();

e) 编码问题

  1. Cookie只能存放合法的ascii字符.

  2. 如果要存放中文,可以将中文转换成合法的ascii字符形式.
    String URLEncoder.encode(String str,String charset)
    String URLdecode,decode(String str,String charset)

    注:建议添加cookie时,都统一编码(使用以上对保存的数据进行处理)

f) 生存时间问题
cookie.setMaxAge(int seconds);//设置生存时间

  1. 单位是秒
  2. Sencods>0 浏览器通常会将cookie保存在硬盘上,超过指定的时间,cookie失效.
    sencods<0 默认值(浏览器会将cookie保存在内存中)
    sencods=0 删除cookie.将cookie的时间设置为0就删除了.

g) Cookie的路径问题

  1. 什么是cookie的路径问题?
    浏览器访问服务器上某地址,会比较请求地址是否符合cookie的路径要求,只有符合的cookie才会被发送。
  2. Cookie的默认路径?
    等于添加cookie的web组件的路径:比如:/servlet-day06/biz01/addCookie.jsp添加了一个cookie则cookie的默认路径是/servlet-day06/biz0.
  3. 匹配规则:
    要访问的地址必须是cookie的路径或者其子路径.
  4. 设置cookie路径
    cookie.setPath(String path);

h) Cookie的限制

  1. Cookie不安全.(敏感数据要加密处理)
  2. Cookie可以被用户禁止.
  3. Cookie只能保存少量数据(大约4k).
  4. 浏览器端保存的cookie的数量也有限制.(几百个)
  5. Cookie只能保存字符串.

2 Session(会话)

a) 什么是session?
服务器端为了保存状态而创建的一个特殊的对象.

b) 工作原理
浏览器访问服务器时,服务器创建一个特殊的对象session(该对象有唯一一个id,称之为sessionid)服务器会将sessionid以cookie的形式发送给浏览器;当浏览器在访问时,会将sessionid发送过来,服务器端可以利用这个session找到对应的session对象.

c) 如何获得session对象?

  1. 方式一
    httpSession session = request.getSession(boolean flag);
    当flag为true时,先查看请求当中有没有sessionid,如果没有则创建一个session对象,如果有,依据sessionid查找对应的session对象.如果找到则返回,找不到会创建一个新的session对象.
    当flag为false时,先查看请求当中有没有sessionid,如果没有则返回null,如果有,依据sessionid查找对应的session对象.如果找到则返回,找不到返回null.
  2. 方式二
    httpSession session = request.getSession();
    等价于request.getSession(true);

d) 几个方法

  1. String session.getId();
  2. setAttrbute(String name,object obj);
  3. Object getAttrbute(string name);
  4. removeAttrbute(string name);//解除绑定

e) session超时

  1. 什么是session超时?
    服务器会将空闲时间过长的session对象删除掉.
    注:为了节省内存空间的占用.服务器默认的超时限制一般是30分钟.
  2. 怎么修改?
    配置文件(web.xml)中修改session config的时间数值.
  3. SetMaxInactiveInterval(int second);//两次请求之前的最大间隔时间.如果超过了时间限制则服务器会销毁session对象.

f) 删除session
  invalidate();