Java Web之Cookie&Session

存在于浏览器中的一小段 数据,可用于保存用户名,请求时可以通过request传到服务器,服务器可以获取到Cookie的数据,并处理它,然后可以通过response响应,可以根据cookie的不同来做成不同的响应.

但是Cookie并不安全,它是存在于浏览器的数据,用户可以直接接触到,从而导致不安全,一般需要进行加密处理.

Cookie的API

  1. 构造方法

    Cookie(String name,String value)

    Cookie数据存储是k-v方式的.

  2. 其他方法

    • getName() 得到名字
    • getValue() 得到值
    • setDomain() 设置有效域名
    • setPath() 设置有效路径
    • setMaxAge() 设置有效时长

添加Cookie

1
2
3
4
Cookie cookie = new Cookie("remember","hello");//key=remember,value=hello
cookie.setPath("/Day11");//路径
cookie.setMaxAge(60*60);//有效时长,默认为会话级别(关浏览器即无)
response.addCookie(cookie);//添加到response,然后返回给浏览器

删除Cookie

cookie并没有方法可以直接删除,可以写一个同路径,同名的Cookie,有效时长设置为0,返回给浏览器的Cookie在0秒后就删除.

1
2
3
4
Cookie cookie = new Cookie("remember","");
cookie.setPath("/Day11");
cookie.setMaxAge(0);//时长为0
response.addCookie(cookie);

服务器获取Cookie

  1. EL表达式

    1
    ${cookie.get("remember").value}
  2. Java代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <%
    String str = "";
    Cookie[] cookies = request.getCookies();
    if (cookies!=null){
    for (Cookie cookie : cookies) {
    if (cookie.getName().equals("remember")) {
    str = cookie.getValue();
    }
    }
    }
    %>

    <%=str%>

request 获取的是Cookie数组,想要特定的Cookie需要遍历,通过name找到该Cookie.

Session

用于服务器端的数据保存,是一次会话,会话在用户第一次请求开始,在用户关闭浏览器结束,但是Session并不会在服务器端立刻被销毁而是等待一段时间(Tomcat默认为30分钟),如果等待时间内,用户用同一个SessionID请求,即可重新唤起该Session.SessionID是一段cookie数据,Session技术的实现需要依赖于Cookie.Session是浏览器隔离的,不同浏览器的请求会有不同的会话产生于服务器后台,它们之间没有联系,不可数据传输.但是同一个Seesion下,可以实现数据传输.

Session使用

  1. 获得Session

    1
    HttpSession session = request.getSession();

    很多地方可以获得Session,不要局限于使用request来获得.

  2. 保存数据

    1
    session.setAttribute("user", user);

    k-v形式,不过value不同于Cookie的value,它可以传输Object类型的数据(Cookie仅仅可以存字符串),

  3. 取得数据

    1
    Object user = session.getAttribute("user");

    同一Session下,可以用getAttribute(key) 方法获得该数据.

范围总结

Request范围

  1. 创建于用户发送一次请求
  2. 销毁于服务器作出响应
  3. set/getAttribute(…)来存取数据
  4. 作用范围:一次请求

Session范围

  1. 创建于服务器端第一次调用getSession()方法的时候.
  2. 销毁于Session过期,非正常关闭服务器,手动调用session.invalidate();
  3. 存取数据与request类似
  4. 作用范围:一次会话(多次请求)

ServletContext范围

  1. 创建于服务器启动时期,一个web项目对应一个单独的ServletContext.
  2. 销毁于服务器关闭
  3. 存取数据与上面两个类似
  4. 作用范围:整个应用