Cookie和Session快速记忆笔记

来源:互联网 发布:豫章学院 知乎 编辑:程序博客网 时间:2024/06/05 02:03

如果一个数据在n个页面之间传递,我们可以通过Parameter来实现,但要确保每个环节不出错。为此,JavaWeb为我们提供了共享数据的技术,分别是Cookie和Session。

Cookie

此为浏览器端的共享数据技术!
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了

Cookie原理

这里写图片描述

1:创建Cookie对象.

Cookie cookie = new Cookie(String name,String value);   参数:         name:  该当前Cookie取一个唯一的名字.         value: 存储在Cookie的共享数据,只能是String类型. Cookie cookie = new Cookie("currentName","will");

2:把Cookie放入响应中,响应给浏览器,把共享的数据存储在浏览器中.

response.addCookie(cookie);

3:获取Cookie以及获取Cookie中的数据.因为Cookie存在在请求头中,所以应该通过request去获取.

  Cookie[] cs = req.getCookies();

获取当前Cookie的名字: String name = cookie对象.getName();
获取当前Cookie的值: String value= cookie对象.getValue();

4.中文编码的问题:

//存中文Cookie cookie=new Cookie("account", URLEncoder.encode(account,"UTF-8"));//取中文account = URLDecoder.decode(cookie.getValue(),"UTF-8");

5:修改Cookie中指定属性名的属性值.
需求:修改Cookie cookie = new Cookie(“currentName”,”will”);
* 方式1:创建一个同名的新的Cookie.

  Cookie c = new Cookie("currentName","Lucy");
  • 方式2:获取该Cookie对象,通过setValue方法,重新设置新的value值.

      Cookie对象.setValue("新的值");

6.设置Cookie的共享作用域:如果一个Servlet的url-pattern为/abc/xxx,而另一个Servlet的url-pattern为/cde/xxx,那么他们是无法共享数据的。但是我们可以设置统一共享的路径:

cookie.setPath("/");

如果希望不同的二级域名中可以共享Cookie,那么就要设置Cookie的domain了。例如:music.baidu.com、map.baidu.com、tieba.baidu.com,它们的域名不同,但百度希望它们之间可以共享Cookie,那么就要设置domain了:

cookie.setDomain("");

7.设置Cookie的存活时间:

    //默认情况下的存活的时间是 当浏览器关闭后 共享的数据就没了    //当cookie存活时间为正数的时候 说明存活几秒    //当cookie存活时间为0的时候 说明马上失效 此操作可以在用户注销的时候使用    //当cookie存活时间为负数的时候 就是会话Cookie    cookie.setMaxAge(-1);

8.Cookie的缺陷:
1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全.
2):Cookie存储中文比较麻烦(得编码,再解码).
3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得死还有N个Cookie.
4):一个站点对Cookie有限制:
Cookie大小限制在4KB之内;
一台服务器在一个客户端最多保存20个Cookie;
一个浏览器最多可以保存300个Cookie;

Session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中。

这里写图片描述

1:创建和获取Session对象.

  HttpSession session = request.getSession(true);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就先创建一个再返回.  HttpSession session = request.getSession(false);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就返回null.  HttpSession session = request.getSession();等价于HttpSession session = request.getSession(true);

2:往Session中存储数据.

  session对象.setAttribute(String name,Object value);

3:从Session中取出数据.

  Object value = session对象.getAttribute(String key);

4:删除Session(用户注销登陆).

 1):删除Session中指定属性名的值.    session对象.removeAttrbute("currentName"); 2):销毁Session对象(Session中所有的属性都不存在).    session对象.invalidate();

5.Session的超时管理

在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session.session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.

Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了。我们也可以在web.xml中设置超时时间

<!--  浏览器与服务器两次交互的时间超过1分钟 则会删除Session --><session-config>    <session-timeout>1</session-timeout></session-config>

6.URL重写.

Session是一种特殊的Cookie,而浏览器可以禁用Cookie.此时,需要在每一个资源之后,手动的携带session的ID.

/session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=872870F9466CE7B3A11FD3B768FDD684

注意:开发中都不会取消接受Cookie的.

7.Session的细节:
1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION: