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方法
4. Cookie常用方法
- 读写maxAge属性的方法
Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
- 在客户端添加Cookie
Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
response.addCookie(cookie); // 输出到客户端
- 修改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); // 输出到客户端
- 删除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活跃了一次。
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失效