cookie和session技术原理总结

cookie技术:

              1 作用:解决了发送不同请求的数据共享问题

              2 使用:

                     2.1 创建cookie对象:cookie c=new cookie(String name ,String value)

      2.2 响应cookie信息给客户端(浏览器),response.addcookie(cookie cookie)

      2.3 获取cookie,拿到数据 Cookie[] request.getcookies()

              实现原理:基于响应头set-cookie和请求头cookie实现

             

注意: 一个cookie对象储存一条数据,多条数据,可以多创几个cookie对象进行存储

3 存储方式:

(1)临时存储:存储在浏览器的运行内存中,浏览器关闭即失效

(2)定时存储:设置了cookie的有效期(cookie.setMaxAge(int seconds)),存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息,默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径(cookie.setpath(“路径”))

4 获取cookie信息:req.getcookies(),返回一个cookie类型的数组

5 cookie细节:

                     1 一次可不可以发送多个cookie?

      可以创建多个cookie对象,使用response调用多次addcookie方法发送cookie即可

                     2 cookie在浏览器中保存多长时间?

                            1默认情况下,当浏览器关闭后,cookie数据被销毁

                            2持久化存储:

                                   *SetMaxAge(int seconds)

        a. 正数:将cookie数据写到硬盘的文件中,持久化存储,cookie存活时间

        b. 负数:默认值

        c. 零:删除cookie信息

                      3 cookie能不能存中文?

                                   *在Tomcat8之前cookie中不能直接存储中文数据

                                          需要将中文数据转码,一般采用URL编码

                                   *在Tomcat8之后,cookie支持中文数据

                       4 cookie的共享问题?

        1.      假设在一个Tomcat服务器中,部署了多个web项目,那么这些项目中的cookie能不能共享?

        *默认情况下cookie不能共享

        *setPath(String path):设置cookie的共享范围。默认情况下,设置当前的虚拟目录(如果共享,则可以将path设置为“/”)

                              2. 不同的Tomcat服务器间cookie共享问题?

        *setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享

        * setDomain(“.baidu.com”),那么tieba,baidu.com和new.baidu.com中cookie可以共享

 

特点:浏览器端的数据存储技术

         存储的数据声明在服务器端

浏览器对于单个cookie的大小有限制(4kb)(不同浏览器大小不同)以及对同一个域名下的总cookie数量也有限制(20个)(不同浏览器不同)

Cookie一般存储少量不太敏感的数据

 

session技术:

11 session技术是依赖cookie技术的服务器端的数据存储技术,存储在服务器端,由服务器创建,每个用户独立拥有一个session,默认存储时间30分钟

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

3 原理:session是依赖于cookie的,用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的sessionid使用cookie技术储存到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据

4 使用:

       4.1创建session对象(获取session对象)

              1. HttpSession hs=req.getSession();

       4.2 使用httpSession对象:

              1 object getAttribute(String name)

              2 void setAttribute(string name,object value)

              3 void removeAttribute(string name)

       4.3

              如果请求中有sessionid,则返回对应的session对象

    如果请求中没有sessionid,则创建新的session对象,并将其sessionid作为cookie数据存储到浏览器的内存中

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

                     4.2 设置session存储时间

                            hs.setMaxInactiveInterval()

                     4.3 设置session强制失效:hs.invalidate()

                     4.4 存储和获取数据

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

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

      4.5 作用域:一次会话(在jsession和session对象不失效的情况下为整个项目内)

  细节: 1 当客户端关闭后,服务器关闭,两次获取session是否为同一个

                            * 默认情况下不是

* 如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存

       Cookie c=new cookie(“JSESSIONID”,session.getid())

       c.setMaxAge()

       response.addcookie(c)

                     2 客户端不关闭,服务端关闭后,两次获取的session是同一个吗?

                            * 不是同一个,但是要确保数据不丢失:

                                   a. session钝化:

                                          在服务器关闭之前,将session对象系列化到硬盘上

                                   b. session的活化:

            在服务器启动之后,将session文件转化为内存中的session对象即可

                     3 session的失效时间?

                            1服务器关闭

                            2 session对象调用invalidate()

                            3 session默认失效时间(一般为30分钟)

                                   选择性配置修改(在Tomcat的web.xml文件中)

                                          <session-config>

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

                                          </session-config>

                     4 session的特点

  1. 1.      session用于存储一次会话的多次请求的数据,存在服务器端
  2. 2.      session可以存储任意类型,任意大小的数据

5 注意:

(1)sessionid存储在了cookie的临时存储空间中,浏览器关闭即失效

(2)如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也      是JSP中隐含的 session对象的来历。

  由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

  请求servlet不会自动产生sessionid,请求jsp会自动产生session(原因是index.jsp的Java源代码代码中,自动获取了session)

 

posted @ 2020-04-16 10:27  Tony老三  阅读(249)  评论(0)    收藏  举报