• 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保存到客户端。这也是一个新的会话开始了。 

  • 相关阅读:
    HBase(九)HBase表以及Rowkey的设计
    iOS-动态库创建(详解)
    组件化-动态库实战
    Xcode创建子工程以及工程依赖
    XMPP详解
    iOS中WebKit框架应用与解析
    HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)
    OC与JS交互
    iOS 与 js交互的其一方法 WebViewJavascriptBridge的使用
    OC和JS调用
  • 原文地址:https://www.cnblogs.com/MrQlyn/p/10236319.html
Copyright © 2020-2023  润新知