web核心66-day11笔记(cookie和session)

web核心66-day11笔记(cookie和session技术)


1.cookie和session技术

目的:
    为了保证在网络交互过程中保存一些临时产生的数据 

2.session会话技术

会话:
当你去访问某个网站的时候,打开网站 我们称会话开始了,关闭浏览器我们称会话结束了

3.cookie:

保存数据在浏览器端的
小甜点 小饼干

4.cookie的工作流程:

当咱们浏览器访问服务器的时候,除了正常业务逻辑之外,服务器可以让我们编程决定准备一个键值对数据(key,value) cookie对象
这时候在正常业务逻辑返回的时候,顺便带上cookie对象(底层通过 set-cookie的响应头来做)
返回浏览器内容,浏览器正常解析,除此之外,还会将偷偷返回的cookie 保存下来,

接下来,再次访问服务器的时候,浏览器会根据一定规则  自动偷偷的把cookie带上,(底层通过一个cookie的请求头做到),
request向服务器端获取cookie 提供好方法 直接获取

5.cookie的api:

1)创建cookie对象
    cookie cookie=new cookie("名字","值");
2)响应头带上cookie
    response.addCookie(cookie)

3)获取cookie
    cookie[] cookie=request.getCookies();

4)cookie自己方法
    getName();//获取cookie的名字
    getValue();//获取cookie的值

5)cookie的有效期级别:
    会话级别:浏览器关了 浏览器销毁了 ,cookie就没有了;

    持久化级别:
        setMaxAge(int 秒值) 
            正数:写多少存多少秒
            0: 立即删除该cookie 同名同路径
            负数:表示会话级别
        setPath("路径:");给你当前cookie设置一个路径,在下一次发送请求的时候,我们的浏览器会检查 cookie的路径 是否包含此次请求的路径;

        默认情况下,路径为当前请求路径的父目录

            例子:
                请求 /day1101/xx/yy/zz  服务器返回cookie 没有设置path
                cookie的path为 /day1101/xx/yy/,此路径下都可以应用cookie;(此处path说的是 urlPatterns ="/cookie/path")

                接下来访问服务器的时候,
                    /day1101/xx/yy/ww
                    /day1101/xx/yy/ww/xx/asdas
                    以上这些 都可以带上
                如果这些:
                    /day1101/xx
                    /day1101/aa/bb/cc

        主动调用方法设置cookie路径:(设置路径后,怎么取出该cookie?)
            path路径写法 以/打头 跟上项目名 后面自定义

            一般使用 都是要求大家设置为项目名 一般都是整个项目都有效的意思

6.cookie注意事项:

1).cookie 数据大小不要超过4kb
2).cookie 不支持中文 建议不要用中文
3).cookie不能跨浏览器
4).cookie规范:
    要求浏览器产商 每一个网站最多给浏览器设置20个cookie 浏览器最多保存300个cookie

7.session技术:

会话技术服务器端技术

7.1..session工作机制
    当你去访问服务器的时候,服务器内部会去检查你是否携带了一个名字叫做 JSESSIONID 的 cookie --> Cookie("JSESSIONID",随机字符串);
    7.1.1.第一次访问服务器:
        没有带:
            服务器中 可以调用api 为你开辟一块内存空间 底层 new Session()对象
            紧接着调用方法 随机生成一个唯一的字符串(32位?) ,
            将刚刚创建好的session对象跟字符串 映射起来 (术语叫做放入session池)
            相当于放入到了一个map集合中
            {
                随机字符串1:session对象1,
                随机字符串2:session对象2,
                随机字符串3:session对象3,
                随机字符串4:session对象4,
                ......
            },
            紧接着 随机的字符串会被 包装成一个cookie --> new Cookie("JSESSIONID",随机字符串);
            并且cookie的path为项目路径 age是-1 ----> 此cookie以后不管项目任何资源都可以调用,并且是会话级别的;
            随着响应带回cookie给浏览器,浏览器将此cookie保存;
    7.1.2.第二次访问服务器:
        带着呢:
            服务器可以取出cookie的随机字符串,拿着随机字符串去session池中 取出对应的session对象;
            你想要对自己session做什么 自己决定 

    7.1.3.如果您被劫持了呢?(与session对应的随机数丢失)
        随机字符串去session池中有可能 也会查找不到

        若查不到,服务器重新开始 第一个过程:
            服务器中 可以调用api 为你开辟一块内存空间 底层 new Session()对象
            紧接着调用方法 随机生成一个字符串  32位 ,
            将刚刚创建好的session对象跟字符串 映射起来 (术语叫做放入session池)
            相当于放入到了一个map集合中
            {
                随机字符串1:session对象1,
                随机字符串2:session对象2,
                随机字符串3:session对象3,
                随机字符串4:session对象4,
                ......
            },
            紧接着 随机的字符串会被 包装成一个cookie  new Cookie("JSESSIONID",随机字符串)
            并且cookie的path为项目路径 age是-1 ---->cookie以后不管项目任何资源都可以 并且会话级别的
            随着响应带回给浏览器


7.2..session的api:
    1).创建session
        //第一次创建
        Httpsession session = request.getSession()
    2).获取seesion
        //第二次是获取
        Httpsession session = request.getSession()

    3).session提供方法是(属性)
        value = getAttribute("name值")
        setAttribute("name值","value值")
        removeAttribute("name值")

session特性:
    存储是私有的,session池存储在服务器.

8.session的生命周期:

1).创建:
    Httpsession session = request.getSession()
2).销毁:
    2.1.超时销毁
        tomcat而言 默认是30分钟
        选择性遗忘方法 可以做
            setMaxInactiveInterval(int interval) 
    2.2.手动销毁
        invalidate()//立即杀死session--------------------->重要
    2.3.正常关闭服务器
        服务器会将还没有到期的session进行钝化
        下次启动的时候 我们称之为 活化

    2.4.非正常关闭服务器 卡死了 断电了

3).session它存在时间多久 -----> 会话级别的(浏览器关闭即销毁cookie)
4).当有请求时候,创建session对象;当到时或浏览器关闭(cookie是会话级别,关闭浏览器则丢失此cookie)时候,销毁.

//////////////////////////////////////////////////////////////////////////

session可以存储数据,存在服务器端 存储是私有的

案例二 一次性验证例子

需求:
    访问登录页面,填入账号密码 验证码,提交表单

    如果不输入验证或验证码为空格:
        在页面提示 验证码必须输入
    如果输入 验证是否正确 
        错误:
        在页面提示 验证码错误重新输入
        正确:
            下一步验证账号密码
                错误了:
                    提示账号密码错误
                正确了:
                    登录成功,跳转首页 在首页显示当前登录人名字

案例二 步骤分析:

1.复制原来的项目(包含页面/登陆/注册/查询用户/验证码产生)
    --各类中会出现一些错误,重新导入包或类就行
2.复制CodeSevrlet(验证码产生Servlet);
    1).登录页面 改造验证码(2处)-->
        --img标签改为点击(刷新)会变化的验证码(src="http://localhost/code"),
        --验证码input输入框起名字(提交表单),
    2).在CodeServlet 中将产生的字符串验证码-->存入session中;
        --request.getSession().setAttribute("标识名","验证码内容msg");
3.提交表单,指向loginServlet,改造loginServlet,增加验证码逻辑判断:
    1).验证码(null或空格)逻辑判断;
        --页面错误提示:创建login.jsp,login.html中的登陆链接也改位login.jsp;
        --loginservlet中获取session,设置属性-->jsp页面显示验证码错误信息
        --重定向给login.jsp页面,用session获取要显示的错误信息(没获取到展示null),并展示出来
    2).验证码错误逻辑判断:
        --错误则重定向给login.jsp(同上),
    3).账号密码逻辑判断; 
        --错误则重定向给login.jsp(同上)
        --成功,重定向到首页index.jsp-->首页标识登陆状态,将当前登陆的对象放入session中
    4).index.jsp页面,获取session,获取标识user对象,判断是否登陆成功:
        --成功,显示"xxx欢迎您"
        --未登陆,不显示.
    5).退出登陆
        --把退出登陆,指向loginoutServlet,创建LoginoutServlet类
        --把session销毁,重定向到首页index
    6).浏览器回退问题(没有发请求,只是从浏览器内存中获取了验证码,验证码将无意义)
        --让验证码只能用一次-->在loginservlet中,用完即删除验证码信息的session
        --if(session==null),重定向login.jsp-->"验证码只能使用一次"
    7).验证码看不清,单击图片更换验证码

重点总结:

    cookie的产生原理/工作原理/生命周期;
    session的产生原理/工作原理/生命周期;
    登陆/注册/查询用户/验证码产生 案例中,各种细节注意事项,需要考虑非常全面(思维???);

    1.表单提交的信息,在request请求体中存储,用request.getParameter("name值")获取;
    2.session.setAttribute("msg","验证码不可为空"); 储存在响应头

你可能感兴趣的:(notes)