web 学习笔记11-Cookie和Session技术

1、会话技术:

就是相当于打电话. 这个电话包含了多个请求和响应。
解决了一个在多个请求中共享数据的问题。
解决方案:
a.Cookie技术:数据存在本地
    浏览器发送购买“篮球”给服务器的servlet ---- 服务器发送set-cookie给客户端,在客户端浏览器保存 --- 下次结账的时候,将本地的cookie携带给服务器。这个就是一个简单的cookie技术。
b.Session技术:数据存在服务器
    浏览器发送购买“篮球”给服务器的servlet --- 服务器servlet会产生一个Session对象(session=request.getSession();) --- 
    下一次结账的时候,服务器会取出对应的Session数据。
    注意:不同的浏览器服务器会创建不同的session对象。

2、Cookie属性:

Cookie只是保存一些重要的信息,每个网站20个,每个cookie最大4K。
一下4个属性比较重要
    a.name: Cookie的名字
    b.value: Cookie的值
    c.path : 可选的,Cookie的存储路径  默认情况下存储的路径是访问的Servlet所在的路径
    d.MaxAge: 可选,最大的存活时间 ,默认情况下是存放在缓存区中的.,生命周期就是一个会话。

不是很重要的属性
    version: Cookie的版本
    domain: 域名(那个网站)
    Comment: 备注。

3、一个简单的示例演示下:

//演示记录上次访问的时间
public class ServletCookie extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8") ;
        response.setContentType("text/html;charset=UTF-8") ;
        PrintWriter out = response.getWriter() ;

        out.write("您上次访问的时间是: ") ;
        //拿到客户端携带的记录上次访问时间的Cookie : 假设Cookie的名字是lastaccesstime , 值是一个long类型的数字
        //拿到客户端携带的所有的Cookie
        Cookie[] cs = request.getCookies() ;

        //循环判断拿到我们需要的Cookie,如果是第一次访问,那么cs肯定是null,所以需要一个判null处理
        for (int i = 0; cs!=null && i < cs.length; i++) {
            Cookie c = cs[i] ;
            if(c.getName().equals("lastaccesstime")){
                //说明找到了需要的Cookie
                String time = c.getValue() ;
                //将time转换成long类型的值
                long t = Long.parseLong(time) ;
                //格式化为我们需要的格式
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss") ;
                //创建一个date对象
                Date d = new Date(t) ;
                //将数据输出到页面上
                out.write(sdf.format(d) + "&nbsp;&nbsp;<a href = '"+ request.getContextPath()+"/servlet/ServletCookieDelete'>清除Cookie</a>") ;
            }
        }

        //向客户端发送Cookie
        Cookie c = new Cookie("lastaccesstime",new Date().getTime() + "") ;

        //发送到客户端
        response.addCookie(c) ;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

部署之后在浏览器中输入servlet的访问网址,在浏览器中第一次访问可以看到(chrome浏览器,开发者工具-Network-Headers 查看)
请求头信息:没有携带cookie
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
    Connection:keep-alive
    Cookie:_pk_id.15.1fff=736d748c4f13a259.1474984763.1.1474984763.1474984763.
    Host:localhost:8080
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
响应头信息:返回了一个cookie
    Content-Length:31
    Content-Type:text/html;charset=UTF-8
    Date:Mon, 10 Jul 2017 13:20:54 GMT
    Server:Apache-Coyote/1.1
    Set-Cookie:lastaccesstime=1499692854500; Expires=Sat, 28-Jul-2085 16:35:01 GMT; Path=/day10_00_cookie

第二次访问,请求头信息:
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
    Cache-Control:max-age=0
    Connection:keep-alive
    Cookie:lastaccesstime=1499692854500; _pk_id.15.1fff=736d748c4f13a259.1474984763.1.1474984763.1474984763.(携带了cookie)
    Host:localhost:8080
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36

4、Cookie到底存在哪?

默认存在浏览器缓存里面。
如果需要设置到硬盘上,可以设置setMaxAge

c.setMaxAge(Integer.MAX_VALUE) ;
//设置Cookie的存活时间(只要设置了存活时间,那么此Cookie就将存储到客户端的硬盘上,不会在缓存中存储)

查看cookie的文件
打开IE-Internet选项-常规-设置-查看文件

例如打开一个cookie文件:
    lastaccesstime(名称)
    1499693767047(值)
    localhost/day10_00_cookie(域名/资源地址,下面的不用管,注意这个资源地址是servlet设置了path之后的,如果不设置就是day10_00_cookie/servlet/ServletCookie)
    1536
    2066736896
    35603649
    2077214625
    30603649
    *

所以存在客户端上cookie是不安全的,因为可以手动删除。

5、服务器上怎么删除本地的cookie呢?

创建同名的Cookie,设置存活时间c.setMaxAge(0) ;

例如:我们在另外一个Servlet编写删除“ServletCookieDelete”
public class ServletCookieDelete extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //要想删除客户端存储的Cookie,sun公司没有提供相应的删除方法,
        //所以采用的办法就是创建一个同名的cookie,将存活时间设置为0,然后覆盖客户端存储的Cookie
        Cookie c = new Cookie("lastaccesstime","") ;
        c.setMaxAge(0) ;

        //设置为工程路径
        c.setPath(request.getContextPath()) ;

        //发送到客户端
        response.addCookie(c) ;
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

6、客户端是否携带Cookie,有什么决定呢?

是由浏览器来决定的。

默认情况下,客户端存储cookie的路径就是发送cookie的servlet路径,例如:
    http://localhost:8080/day10_00_cookie/servlet/ServletCookie
    这地址存储的cookie文件是这样的
    localhost/day10_00_cookie/servlet/(域名/资源地址)

如果servlet设置了path,例如:
    c.setPath(request.getContextPath()) ;
    那么存储的cookie文件是这样的
    localhost/day10_00_cookie(域名/资源地址)

浏览器判断的依据:
    url.startWith(path),如果为true就携带。
    这里的url是:你在地址栏中敲入的资源地址(http://localhost:8080/day10_00_cookie/servlet/ServletCookie中的day10_00_cookie/servlet/ServletCookie)
    path是:cookie文件中,localhost/后面的资源地址

例如,你cookie里面地址是localhost/day10_00_cookie
    你在浏览器中输入:
        http://localhost:8080/day10_00_cookie/servlet/ServletCookie
        http://localhost:8080/day10_00_cookie/servlet/ServletCookie1
        http://localhost:8080/day10_00_cookie/ServletCookie2
    都会携带

所以设置path也很重要
    c.setPath(request.getContextPath()) ;//设置为工程路径
    c.setPath("/") ;//设置路径是服务器的根路径    协议 + 主机名 + 端口号,访问服务器上的任意工程资源都会携带此Cookie

7、怎么确定一个Cookie呢?

域名+ 访问路径 + Cookie的名字
例如:
    localhost/day10_00_cookie(域名/访问路径)
    cookie文件中的:lastaccesstime(名称)
使用5里面的删除方法删除cookie是无效的,因为没有设置path,默认的cookie路径不是day10_00_cookie,所以找不到这个cookie。

8、session技术:

session和cookie其实是同一个技术,只是存储数据的地方不同。
cookie存储数据大小有限,session可以存储更多的数据。
每一个浏览器独占一个session。
session是第三个域对象(其他两个:全局对象context,request对象)。

9、创建session:

a.request.getSession() ;   
此方法做了2件事:
    1. 先看浏览器是否携带了一个名字叫JSESSIONiD的Cookie,如果没有,则直接创建一个新的session。存储在客户端的缓存中。
    2. 如果有,则根据Cookie的值去服务端的内存中寻找id的值是此值的session.并且返回,找不到,创建新的返回。

b.request.getSession(boolean flag) ;
    如果flag为true,则相当于情况a
    如果flag为false,则只查不创建。

10、session存活时间:

服务端发送的JSESSIONID默认情况下存储在客户端的缓存中,所以关闭浏览器,session的生命就结束了。
要想多个关闭后还能用,那么必须创建一个新的Cookie,名字也是JSESSIONID,设置存活时间,
此时cookie存储在客户端的硬盘上,下次打开新的浏览器访问,浏览器会携带此Cookie,也就达到了关闭浏览器
还能使用此Session的效果了。

服务器的内存是有限的,如果不设置存活时间,那服务器内存肯帝存不了这么多。tomcat默认30min
可以查看配置文件:
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

11、一个简单的session示例:

ServletSession1.java:
public class ServletSession1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        HttpSession session = request.getSession() ;
        String id = session.getId() ;
        System.out.println("id:" + id);
        session.setAttribute("name", "hello") ;
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

ServletSession2.java:
public class ServletSession2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取session对象
        HttpSession session = request.getSession() ;
        System.out.println("id2:" + session.getId());
        String name = (String) session.getAttribute("name") ;
        System.out.println(name);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

在浏览器中输入:
    http://localhost:8080/session/servlet/ServletSession1
    控制台输出:id:3423BB77C41914BD7C6500366A74E5CF

    chrome中可以看到
    请求头信息:
        Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
        Accept-Encoding:gzip, deflate, sdch
        Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
        Connection:keep-alive
        Host:localhost:8080
        Upgrade-Insecure-Requests:1
        User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
    响应头:
        Content-Length:0
        Date:Mon, 10 Jul 2017 15:12:24 GMT
        Server:Apache-Coyote/1.1
        Set-Cookie:JSESSIONID=3423BB77C41914BD7C6500366A74E5CF; Path=/day10_01_session; HttpOnly(set了cookie)
在浏览器中输入:http://localhost:8080/session/servlet/ServletSession2
    控制台输出:id2:3423BB77C41914BD7C6500366A74E5CF

    请求头信息:(携带了cookie)
        Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
        Accept-Encoding:gzip, deflate, sdch
        Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
        Connection:keep-alive
        Cookie:JSESSIONID=3423BB77C41914BD7C6500366A74E5CF(携带了cookie)
        Host:localhost:8080
        Upgrade-Insecure-Requests:1
        User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36
    响应头信息:(没有set-cookie了)
        Content-Length:0
        Date:Mon, 10 Jul 2017 15:17:12 GMT
        Server:Apache-Coyote/1.1

session

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值