Cookie

  • 作用:解决了发送的不同请求的数据共享问题
  • 使用:Cookie的创建和存储

1.创建Cookie对象

Cookie c=new Cookie(String name, String value);

2.设置cookie(可选)

c.setMaxAge(int seconds);

c.setPath(String uri) ;

resp.addCookie(c);

  • Cookie的获取

1.获取Cookie信息数组

Cookie[] cks=req.getCookies();

2.遍历数组获取Cookie信息使用for循环遍历即可,示例:

if(cks!=null){ 
  for(Cookie c:cks){ 
    String name=c.getName();
    String value=c.getValue(); 
    System.out.println(name+":"+value); 
      }
}

一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。

  • 特点

1.Cookie是浏览器端的数据存储技术。存储的数据声明在服务器端。

2.临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。

3.定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径。

Session

  • 问题:一个用户的不同请求处理的数据共享怎么办?

使用session

  • 技术原理

用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。

  • 特点

存储在服务器端,由服务器进行创建依赖Cookie技术 * 一次会话 * 默认存储时间是30分钟 *

  • 作用

解决了一个用户不同请求处理的数据共享问题

  • 使用

1.创建session对象/获取session对象
HttpSession hs=req.getSession();

2.如果请求中拥有session的标识符JSESSIONID,则返回其对应的session队形

3.如果请求中没有session的标识符JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器内存中。

4.如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。

5.设置session存储时间

hs.setMaxInactiveInterval(int seconds);

  • 注意

1.在指定的时间内如果session对象没有被使用则销毁,如果使用了则重新计时。

2.设置session强制失效

hs.invalidate();

3.存储和获取数据

存储:hs.setAttribute(String name,Object value);

获取:hs.getAttribute(String name) 返回的数据类型为Object

存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。

4.使用时机

一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。

  • 总结

session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。用户的任意请求在处理时都能获取到同一个session对象。

作用域:一次会话,在JSESSIONID和SESSION对象不失效的情况下为整个项目内。

session失效处理,将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致 则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。

注意:JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭失失效。

Application

  • 问题: 不同的用户使用相同的数据

使用ServletContext对象

  • 特点

服务器创建 用户共享

  • 作用域

整个项目内

  • 生命周期

服务器启动到服务器关闭

  • 使用

1.获取ServletContext对象

第一种方式:

ServletContext sc=this.getServletContext();

第二种方式:

ServletContext sc=this.getServletConfig().g

etServletContext();

第三种方式:

ServletContext sc=req.getSession().getServ

letContext();

2.使用ServletContext对象完成数据共享

2.1数据存储:

sc.setAttribute(String name, Object value);

2.2数据获取

sc.getAttribute("str") 返回的是Object类型

3.获取项目webroot下的资源的绝对路径

String path=sc.getRealPath(String path);


For sharing , For emulating , For enterprising