Cookie和Session

一、Cookie

Cookie:是客户端在发送请求时服务器缓存在浏览器的数据,一般和request域配合转发使用,转发使用相同request能够将

               Cookie在不同页面上保存获取

1、Servlet(JSP里<%%>)中发送Cookie给客户端

 Cookie cookie = new Cookie("data", "abcdefg");
 response.addCookie(cookie);

2、 Servlet(JSP里<%%>)中接收客户端发来的Cookie

Cookie[] cookie = request.getCookies();
 if(cookie != null) {
    for(Cookie c : cookie) {
      System.out.println(c.getName() + "=" + c.getValue());
    }
 }

3、Cookie的生命周期:全都由setMaxAge()方法决定,默认为退出浏览器(会话结束)Cookie消失

>0:保存在浏览器的时间,单位为秒

=0:删掉浏览器已存在的同名Cookie

<0:默认值,退出Cookie消失

4、Cookie的路径:由setPath()方法决定,当访问路径包含Cookie路径时缓存该Cookie

5、Cookie中保存中文:Cookie的name和value都是不能保存中文的,但可以先把中文转换成URL编码,然后在

                                       保存到Cookie的name和value中,获取Cookie时,再使用URL解码即可。

  ******保存中文Cookie

  String name = "姓名";
  String value = "张三";
  name = URLEncoder.encode(name, "utf-8");
  value = URLEncoder.encode(value, "utf-8");

  Cookie c = new Cookie(name, value);
  response.addCookie(c);

  ******取出中文Cookie

  Cookie[] cs = request.getCookies();
  if(cs != null) {
    for(Cookie c : cs) {
      String name = URLDecoder.decode(c.getName(), "utf-8");
      String value = URLDecoder.decode(c.getValue(), "utf-8");
      System.out.println(name + "=" + value);
    }
  }

-------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------

二、HttpSession:Session是一个域对象,用来跟踪会话(即在打开浏览器至结束传输数据,JSP有内置对象Session,

                                                                                             可直接使用,与response,request同理)

***与request域对象、ServletContext域对象区别:在于生命周期不同。request是一次请求(可使用转发延长),

                                                                                ServletContext是服务器关闭时,Session是浏览器关闭时。

***与Cookie不同:Cookie保存在浏览器端,Session保存在服务器端,相同点在于都是由request对象获得。

1. 获取HttpSession:

        HttpSession session = request.getSession();

2、Session域拥有方法:

                setAttribute(String name,Object Key):使用键值对方式存入数据对象

                getAttribute(String name):通过键名取出数据对象

                removeAttribute(String name):通过键名删除已存入的数据对象

3、Session其它常用方法:

            String getId():获取sessionId,涉及Session原理

             int getMaxInactiveInterval():获取Session最大不活动保存时间(单位为秒),默认为30分钟。

             void invalidate():结束Session

            boolean isNew():判断Session是否为第一次创建

4、设置session超时时间,在web.xml文件中配置:
   

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

5、Session的原理
  Session是依赖Cookie实现的。
  Session是服务器端对象
  当用户第一次使用Session时(表示第一次请求服务器),服务器会创建Session,并创建一个Cookie,在Cookie中

  保存了Session的id,发送给客户端。这样客户端就有了自己Session的id了。但这个Cookie只在浏览器内存中存在,

  也就是说,在关闭浏览器窗口后,Cookie就会丢失,也就丢失了SessionId。当用户第二次访问服务器时,会在请求

  中把保存了SessionId的Cookie发送给服务器,服务器通过SessionId查找Session对象,然后给使用。也就是说,只

  要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个Session对象。这样也就可以让多个请求共享同一个Session了。
  当用户关闭了浏览器窗口后,再打开浏览器访问服务器,这时请求中没有了SessionId,那么服务器会创建一个Session,再把SessionId通过Cookie保存到浏览器中,也是一个新的会话开始了。原来的session会因为长时间无法访问而失效。
  当用户打开某个服务器页面长时间没动作时,这样Session会超时失效,当用户再有活动时,服务器通过用户提供的sessionId已经找不到Session对象了,那么服务器还是会创建一个新的sessionSession,再把新的SessionId保存到客户端。这也是一个新的会话开始了。 

原文地址:https://www.cnblogs.com/MrQlyn/p/10236319.html