Cookie和Session的总结

1、开篇

在之前学习这一段的时候我一直有点没弄清楚,其实对Session这块的理解还可以,但是Cookie感觉始终还是欠缺点火候。之后的很长一段时间都基本上很少用Cookie了,渐渐的也淡忘了这一块的知识。

昨天我鼓起勇气,看了一些网上的资料了一些之前学习的资料,对着两个知识点进行一个小总结。希望可以帮助到观看这篇随笔的读者们。

2、Cookie和Session的介绍 (会话管理技术概述)

(1) 什么是会话?
 这里的会话指的是web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始,当关闭浏览器(或者到了过期时间),会话结束。
例如:

我们去网吧上网,在吧台拿到用户名和密码,然后找机器登录,这时候机器就认识了我们,我们就可以开始上网,这就相当于我们开启了一次上网的会话,当我们点击结束下机(或者遇到关机重启),

或者上网时间到了,这时候机器就不再认识我们,那么就叫会话结束。


(2)会话管理技术能做什么?

共享同一个客户浏览器多个请求中数据,例如购物车。(简单权限过滤)

3、会话管理技术一(Cookie)

(1)什么是cookie?

它是客户端浏览器的缓存文件,里面记录了客户端浏览器访问网站的一些内容。它也是Http协议请求和响应消息头的一部分。

(2)cookie能做什么?

能保存客户端浏览器访问网站的相关内容,需要服务器开启cookie。从而每一次访问时,先从本地获取缓存,使用资源共享,并且提高效率。

(3)Cookie的说明。

Cookie有大小,个数限制。每个网站最多只能存20个cookie,且大小不能超过4kb。(32bit 不能超过4096MB)同时,所有网站的cookie总数不超过300个。

(4)Cookie中的属性
        属性:
            name:必要属性,cookie的名称。
            value:必要属性,cookie的值(不能是中文)
            ---------------------------可选属性---------------------------------
            path:cookie的路径(重要)
            domain:cookie的域名(重要),相当于访问的网站(localhost)
            maxAge:cookie的生存时间(相当于生命周期的活着)(比较重要),
                     当删除cookie时,设置该值为0。
                     当不设置该值时,使用的是浏览器的内存,当关闭浏览器之后,cookie将丢失。设置了此值,就会保存成缓存文件(值必须是大于0的,以秒为单位)。
            version:cookie的版本号。(不重要)
            comment:cookie的说明。(不重要)


(5) 在web应用中如何设置和获取Cookie
        定义一个Cookie
            Cookie  cookie  =  new  Cookie(cookieName,cookieValue);
        HttpServletRequest 获取 Cookie
            Cookie[]  cookies = request.getCookies();
            该方法返回的是一个数组。(为什么是数组呢,方便,可以直接拿到与该请求相关的所有cookie)
        HttpServletResponse 添加Cookie
            response.addCookie(cookie);
        添加一个cookie,其实就是添加一个响应消息头
                response.setHeader("Set-Cookie","name=value;path=;maxage=;domain=");
        (为什么没有set方法,原因是set就会把之前的覆盖,所以每次都是添加)。
        如何确定一个唯一的cookie:cookieName+cookiePath+cookieDomain
        定位一个cookie是由 cookie的名称和路径,主机(访问的资源)三部分组成


4、会话管理技术二(Session)--Tomcat的默认过期时间是30分钟。
(1)什么是Session?
            它是一个服务端会话对象,存储用户的会话数据。

(2)获取session的两种方式
            方式一:request:getSession();

    查看是否有jsessionid;1)有通过jsessionid获取session;2)有这块区域就直接用了。

                                                                               2) 没有这块区域就开辟一块session区域。

                                   1)没有直接开辟一块session的区域。

            方式二:request:getSession(Boolean b);true和上面的方法一样,下面是false的解释。

    查看是否有jsessionid;1)有通过jsessionid获取session;2)有这块区域就直接用了。

                                                                               2) 没有直接返回null

                                   1)没有直接返回null

(3)HttpSession对象的状态
        a、什么是持久态
            把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。
            我们把HttpSession持久态也叫做钝化。(与钝化相反的,我们叫活化。)
        b、什么时候使用持久化
            第一种情况:当访问量很大时,服务器会根据getLastAccessTime来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行持久化。
            第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对HttpSession进行持久化。

 

5、关于jsessionid说明

当我们在JAVA后台获取到一块session空间的时候,返回时已经将这块session的id也就是jsessionid代入到浏览器的cookie中(前提是cookie打开),如果你的浏览器cookie没有打开,

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
          //将字符集设置,放在方法体首位
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("text/html;UTF-8");
        HttpSession session = request.getSession();
        System.out.println(session);
        String reUrl = response.encodeRedirectURL("TestServlet");//浏览器cookie没有打开只用这个方法,可以在url后面加上jsessionid,保持会话的持续,注意的是需要所有的跳转都加上这个方法才可以保持jsessionid的拼接
        response.sendRedirect(reUrl);
    }

 

例如:http://localhost:8080/ssm/TestServlet;jsessionid=059A89AE1D32790B3DB6C61C5E138DD1

        带jsessionid的url到后台后,可直接获取session,如果存在获取到的session对象是和之前一样的对象。

 

打印结果:

一月 04, 2017 11:16:10 上午 org.apache.catalina.core.StandardContext reload
信息: Reloading Context with name [/ssm] is completed
aaaaaaaaaaaaaaa
org.apache.catalina.session.StandardSessionFacade@194c6bd
org.apache.catalina.session.StandardSessionFacade@194c6bd
一月 04, 2017 11:16:18 上午 org.apache.catalina.core.ApplicationContext log
信息: Initializing Spring FrameworkServlet 'appServlet'
一月 04, 2017 11:16:18 上午 org.springframework.web.servlet.FrameworkServlet initServletBean
信息: FrameworkServlet 'appServlet': initialization started

 

posted @ 2017-01-04 11:25  陶庭开  阅读(401)  评论(0编辑  收藏  举报