cookie和session会话

会话技术

    会话: 一次会话包含多次请求和响应

    一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到一方断开为止

    会话的功能:在一次会话的范围内的多次请求间共享数据

    方式:

        1.Cookie:

            使用步骤:

                1.创建cookie对象

                    new Cookie(String name,String value)

                2.发送cookie对象

                    response.addCookie(Cookie cookie)

                3.获取Cookie取数据

                    Cookie[] request.getCookies()

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

       

            使用细节:

                1.一次可不可发送多个cookie

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

                2.cookie的声明周期

                    1.默认浏览器关闭后  Cookie消失

                    2.持久化存储 setMaxAge(int seconds)

                        seconds=正数,根据传入的值持久化cookie,将cookie写到硬盘,存活的时间根据传入的值设置

                        seconds=0,删除cookie信息

                        seconds=负数,默认值

                    3.中文存储:tomca8之前不支持,如需存储一般采用URL编码,tomcat8之后支持直接存储。

                        特殊字符不支持,需要使用url编码

                    4.cookie的共享:

                        同一个tomcat部署了多个项目:

                            cookie默认时不共享,可以使用setPath(String path)设置共享,如果要共享可以将path设置为"/"

                         不同tomcat部署:

                            cookie默认时不共享,调用setDomain(String path),path设置一级域名,一级域名相同的多个服务器之间可以共享cookie

                   

            cookie的特点:

                1.cookie存储的数据在客户端

                2.浏览器对于单个cookie的大小有限制(默认4kb),一级对同一个域名下的cookie总数量有限制(一般20个)

           

            cookie的作用:

                1.cookie一般用于存储少量的不太敏感的数据

                2.在不登录的情况下完成服务器对客户端的身份识别

package com.xiaoqiang.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie1Servlet")
public class Cookie1Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("msg", "hello");
        resp.addCookie(cookie);
        Cookie cookie2 = new Cookie("msg2", "hello");
        resp.addCookie(cookie2);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
package com.xiaoqiang.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie2Servlet")
public class Cookie2Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                System.out.println("获取到cookie:name=" + c.getName() + ",value=" + c.getValue());
            }
        }else {
            System.out.println("未获取到cookie的值");
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

        2.Session 服务端会话技术

            在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中。

            特点:

                1.Session用于存储一次会话的多次请求的数据,存在服务器端

                2.session可以存储任意类型,任意大小的数据

            1.使用步骤:

                1.获取session对象

                    HttpSession session = request.getSession();

                2.存储数据

                    void session.setAttribute(key,value);

                3.获取数据

                    Object session.getAttribute(key);

                4.移除session的值

                     void session.removeAttribute(key);

           

            2.原理

                session的实现依赖于cookie

                    浏览器第一次请求服务器,请求头没有cookie信息,服务器会生成一个session对象,并将sessionId通过响应头设置cookie,后边的请求的请求

                头中cookie会带着sessionId请求服务器,服务器会根据sessionId找到对应的session对象,如果请求头的cookie中没有对应的sessionId,服务器会

                重新创建一个session对象

           

            3.细节

               

                1.客户端关闭,两次session是否为同一个

                    客户端关闭后意味着会话结束,cookie会消失,cookie里的sessionId就没有了,

                    下次请求服务器会因为没有sessionId生成新的session对象

               

                2.客户端不关闭

                    客户端不关闭cookie中的sessionId是一直存在的,在有效期内使用的是同一个session对象

                3.客户端不关闭,服务器关闭,两次session对象是否为同一个

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

                    1.session的钝化

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

                    2.session的活化

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

                4.sesion的生命周期

                    1.服务器关闭

                    2.调用 invalidate()销毁

                    3.到默认时效时间自动销毁(一般默认半个小时,容器里可以设置)

            4.与cookie的区别

                1.session在服务器端,cookie在客户端

                2.session没有数据大小限制,cookie有

                3.session相比于cookie数据相对安全

package com.xiaoqiang.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/sessionDemoServlet")
public class SessionDemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setAttribute("session1","session1的值");
        session.setAttribute("session2","session2的值");
        String session1 =  (String) session.getAttribute("session1");
        String session2 =  (String) session.getAttribute("session2");
        response.setContentType("text/html;charset=utf-8");

        response.getWriter().println("session1的值:"+session1);
        response.getWriter().println("session2的值:"+session2);
        session.removeAttribute("session1");
        response.getWriter().println("session1的值被移除了,所以现在session1的值是:" + session.getAttribute("session1"));

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值