Cookie与Session基本使用

Cookie

1. Cookie的基本用法

  • 服务器通过操作Cookie类对象对客户端Cookie进行操作。
  • 通过request.getCookie( ) 获取客户端提交的所有Cookie(以Cookie[ ]数组形式返回)
  • 通过response.addCookie(Cookie cookie)向客户端设置Cookie

2. Cookie的不可跨域名性
问题:Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?

解答:Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

3. Cookie的所有属性
每个属性都有setter、getter方法
Cookie与Session基本使用
4. Cookie常用方法

  1. 读写maxAge属性的方法
Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置生命周期为MAX_VALUE
  1. 在客户端添加Cookie
Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
response.addCookie(cookie);                    // 输出到客户端
  1. 修改Cookie
  • 注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
  • response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。
Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
response.addCookie(cookie);                    // 输出到客户端

Cookie cookie = new Cookie("username","hello");   // 新建Cookie
response.addCookie(cookie);                    // 输出到客户端
  1. 删除Cookie
  • 如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。
Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie
cookie.setMaxAge(0);                          // 设置生命周期为0,不能为负数
response.addCookie(cookie);                    // 必须执行这一句

5. 登陆案例

  • 应用场景:如果用户是在自己家的电脑上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。
  • 实现方法:最直接的是把用户名和密码都保存在Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。但是这是一种比较危险的选择,一般来说不会将隐私信息保存到Cookie中。
  • 实现方法:基于上述方法对密码进行加密,再将账号和密码保存到Cookie中
  • 实现方法:把账号按照一定的规则加密后,加密账号与账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可。这样可以做到只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。
  • 应用实例:把账号保存到名为account的Cookie中,把账号连同加密后的账号保存到名为ssid的Cookie中。验证时验证Cookie中的账号与加密后是否与Cookie中的ssid相等。account_Cookie(账号)、ssid_Cookie(账号、加密账号)

Session

1. Session的基本使用方法

  • 通过request获取Session
  • 通过session.setAttribute( )设置Session
  • 通过session.getAttribute( )获取Session
HttpSession session = request.getSession();			//Servlet底层通过的SESSIONID,获取Session对象。
session.setAttribute("loginTime",new Date());
out.println("登录时间为:"+(Date) session.getAttribute("loginTime"));

2. Session的生命周期

  • Session保存在服务器端,为了获得更高的存取速度,服务器一般把Session放在内存中。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
  • Session在用户第一次访问服务器的时候自动创建。因为Session是Servlet、JSP底层实现的,对高级语言透明,所以只有访问JSP、Servlet等程序时才会创建Session。
  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session活跃了一次。
    Cookie与Session基本使用
    3. Session细节
  • 虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持的。这是因为Session需要使用Cookie作为识别标志。因此服务器向客户端浏览器发送一个名为JSESSIONED的Cookie,它的值为该Session的id。Session也将依据该Cookie来识别是否为同一用户。
  • 该Cookie为服务器自动生成的,maxAge属性默认为-1,表示仅当前浏览器内有效,并且各浏览器窗口不共享,关闭浏览器就会失效。
  • 同一个机器的两个浏览器窗口访问服务器时,会生成两个不同的Session,但是由浏览器窗口内的链接、脚本等打开的新窗口(子窗口)会共有父窗口的Session。

4. Session常用方法

  • void setAttribute(String attribute,Object value):设置Session属性。value信息不宜过大
  • String getAttribute(String attribute):返回Session属性
  • Enumeration getAttributeNames();返回Session中存在的属性名
  • void removeAttribute(String attribute):移除Session属性
  • String getId():返回Session的ID。该ID由服务器自动创建,即继承的Servlet接口底层自己实现,不会重复
  • long getCreationTime():返回Session的创建日期Date createTime = new Date(session.getCreationTime());
  • long getLastAccessedTime():返回Session的最后活跃时间
  • int getMaxInactiveInterval():返回Session的超时时间
  • int setMaxInactiveInterval(int second):设置Session的超时时间
  • boolean isNew():返回该Session是否新创建的
  • void invalidate():使Session失效
上一篇:前后端的身份认证


下一篇:Solon Web 开发,四、请求上下文