cookie 和 session

Posted baierhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie 和 session相关的知识,希望对你有一定的参考价值。

                                 

                 1. Cookie的形成

                                   1)服务器创建cookie对象,把会话数据存储到cookie对象中。

                                                        new Cookie("name","value");

                                     2)  服务器发送cookie信息到浏览器

                                                        response.addCookie(cookie);

                                                        举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)

                                     3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

                                     4)浏览器在下次访问服务器时,会带着cookie信息

                                                   举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)

                                     5)服务器接收到浏览器带来的cookie信息

                                                        request.getCookies();

                  

                2. Cookie的细节

                            1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,

                那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

                            2)void setMaxAge(int expiry) : 设置cookie的有效时间。

                                               正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。

                                               负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!

                                               零:表示删除同名的cookie数据

                            3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,

              每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

               3. Cookie的例子

@WebServlet("/cookie")
public class CookieController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**测试cookie*/
        Cookie[] cookies = req.getCookies();
        if(CheckUtil.isNotEmpty(cookies)){
            for (Cookie cookieid :cookies){
                System.out.println("cookiename:"+cookieid.getName());
                System.out.println("cookiename:"+cookieid.getValue());
            }
        }else {
            System.out.println("没有任何cookie信息");
           /* Cookie cookie = new Cookie("cookie", UUID.randomUUID().toString().replaceAll("-", ""));
            Cookie cookie2 = new Cookie("cookie1", UUID.randomUUID().toString().replaceAll("-", ""));
            resp.addCookie(cookie);
            resp.addCookie(cookie2);*/
           /***直接将cookie放在*/
        }
        resp.sendRedirect(req.getContextPath()+"/aa.html");
    }
}

直接通过请求访问:http://localhost:8080/ssm_securty_web_war/cookie

当第一次访问(第一个浏览器)时,是没有cookie的,当请求返回时如果没有自定义cookie,则程序默认回有一个JSESSIONID cookie,

这个cookie就是session的id

并将cookie存储到客户端,当再次访问的时候浏览器会带着cookie过来,cookie和域名有关,比如127.0.0.1和localhost不同

              

              4. session

                4.1 引入

                            Cookie的局限:

                                     1Cookie只能存字符串类型。不能保存对象

                                     2)只能存非中文。

                                     31Cookie的容量不超过4KB

                            如果要保存非字符串,超过4kb内容,只能使用session技术!!!

                            Session特点:

                                               会话数据保存在服务器端。(内存中)

                 4.2 Session技术核心

                            HttpSession类:用于保存会话数据

                            1)创建或得到session对象

HttpSession getSession() 

                                     HttpSession getSession(boolean create) 

                            2)设置session对象

                                     void setMaxInactiveInterval(int interval)  设置session的有效时间

                                     void invalidate()     销毁session对象

                                     java.lang.String getId()  得到session编号

                            3)保存会话数据到session对象

                                     void setAttribute(java.lang.String name, java.lang.Object value)  保存数据

                                     java.lang.Object getAttribute(java.lang.String name)  获取数据

                                     void removeAttribute(java.lang.String name) 清除数据

                    4.3 Session原理

                                     问题: 服务器能够识别不同的浏览者!!!

                            现象:

            前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!

                            浏览器1(s1分配一个唯一的标记:s001,s001发送给浏览器)

                                               1)创建session对象,保存会话数据

                                                                  HttpSession session = request.getSession();   --保存会话数据 s1

                            浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1   

                                               1)得到session对象的会话数据

                                                            HttpSession session = request.getSession();   --可以取出  s1

                            新的浏览器1(没有带s001,不能返回s1)

                                               1)得到session对象的会话数据

                                                            HttpSession session = request.getSession();   --不可以取出  s2

                            浏览器2(没有带s001,不能返回s1)

                                               1)得到session对象的会话数据

                                                            HttpSession session = request.getSession();  --不可以取出  s3

                            代码解读:HttpSession session = request.getSession();

                                    

                            1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

                                               new HttpSession();

                            2)把JSESSIONID作为Cookie的值发送给浏览器保存

                                               Cookie cookie = new Cookie("JSESSIONID", sessionID);

                                               response.addCookie(cookie);

                            3)第二次访问的时候,浏览器带着JSESSIONIDcookie访问服务器

                            4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

                                               if(找到){

                                                        return map.get(sessionID);

                                               }

                                     Map<String,HttpSession>]

                                               <"s001", s1>

                                               <"s001,"s2>

                            5)如果找到对应编号的session对象,直接返回该对象

                            6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程

                         结论:通过JSESSIONcookie值在服务器找session对象!!!!!

                     4.4 Sesson细节

                            1java.lang.String getId()  得到session编号

                            2)两个getSession方法:

                                               getSession(true) / getSession()  : 创建或得到session对象。没有匹配的session编号,自动创建新的session对象。

                                               getSession(false):              得到session对象。没有匹配的session编号,返回null

                            3void setMaxInactiveInterval(int interval)  设置session的有效时间

                                                        session对象销毁时间:

                                                                 3.1 默认情况30分服务器自动回收

                                                                 3.2 修改session回收时间

                                                                 3.3 全局修改session有效时间

<!-- 修改session全局有效时间:分钟 -->

    <session-config>

       <session-timeout>1</session-timeout>

    </session-config>

 


                              3.4.
手动销毁session对象 

                                       void invalidate()      销毁session对象

                            4)如何避免浏览器的JSESSIONIDcookie随着浏览器关闭而丢失的问题

                                      

/**

        * 手动发送一个硬盘保存的cookie给浏览器

        */

       Cookie c = new Cookie("JSESSIONID",session.getId());

       c.setMaxAge(60*60);

       response.addCookie(c);

                         总结: 

                                     1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

                                     2Cookie技术:

                                                        new Cookie("name","value")

                                                        response.addCookie(coookie)

                                                        request.getCookies()

                                     3Session技术

                                                       request.getSession();

                                                       setAttrbute("name","会话数据");

                                                                   getAttribute("会话数据")

                       4.5 Sesson例子

@WebServlet("/sessionServlet")
public class SessionController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.setAttribute("name","baierhu");
        System.out.println("当前时间"+System.currentTimeMillis());
        session.setMaxInactiveInterval(10);
        /**设置过期时间为10秒*/
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("session测试");
    }
}

session时间设置过长会有问题,当浏览器关闭的时候sessionid没有了,但是存储在sessoin中的数据还是在内存中存在的

 

以上是关于cookie 和 session的主要内容,如果未能解决你的问题,请参考以下文章

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

Cookie和Session的工作流程及区别(附代码案例)

cookie和session

cookie和session

cookie和session

会话技术知识点整理(Cookie和Session)