会话技术:cookie和session

一.会话技术
会话:会话指的是多次请求和多次响应,客户端在第一次给服务器发送请求时会话建立,直到一方断开为止。
功能:可以在多个请求之间共享数据。
方式:客户端会话技术(cookie)和服务器端会话技术(session)

二.客户端会话技术
客户端会话技术采用cookie实现:
先直接使用,然后讲解原理,使用步骤如下:
(1).创建cookie对象:Cookie cookie = new Cookie(“msg”, “cookieInfo”);
(2).发送cookie:response.addCookie(cookie);
(3).获取cookie: request.getCookies();

1.添加cookie

	@RequestMapping("/addCookie")
    public String testAddCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie cookie = new Cookie("msg", "cookieInfo");
        response.addCookie(cookie);
        return "Cookie added successfully";
    }

启动项目,浏览器打开network访问该url,在响应头处可看到添加的cookie信息
在这里插入图片描述
2.获取cookie

	@RequestMapping("/getCookie")
    public String testGetCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();
        if (cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println("cookie键:"+name);
                System.out.println("cookie值:"+value);
            }
        }
        return "Cookie obtained successfully";
    }

可以看到控制台打印了刚才添加的cookie信息
在这里插入图片描述
3.原理
客户端请求/addCookie时会话建立,这里我们设置了cookie的值,然后通过response将cookie发送到客户端浏览器。在浏览器未关闭的情况下,也就是此次会话还未结束(服务器不做任何设置默认浏览器关闭则此次会话关闭),再请求/getCookie时,客户端会将刚才的cookie信息通过放在请求头一并发送到服务器,服务器通过request.getCookies()即可获取浏览器发送过来的cookie。下图是第二次请求的请求头,可以看到浏览器在请求头中将该域名(也就是localhost)的该会话下的所有cookie发送到服务器。
在这里插入图片描述
4.cookie使用的注意事项
(1)浏览器对每个cookie的大小都有限制,基本在几kb左右,而且浏览器对每个域名下的cookie数量也做了限制,20个左右。再个cookie存放在浏览器端,这种方式不安全。所以可以使用cookie存放容量小且对安全要求不高的数据。
(2)默认情况下浏览器关闭,会话结束,cookie也会销毁。可以使用setMaxAge(int seconds)这个方法设置cookie的存活时间,做此设置浏览器会将cookie持久化到磁盘,到了过期时间会自动删除cookie信息。

三.服务器端会话技术
服务器端会话技术采用session实现
这里同样直接使用,然后讲解原理,使用步骤如下。
(1)获取HttpSession对象:HttpSession session = request.getSession();
(2)设置session的值:session.setArrtibute(“msg”, “sessionInfo”);
(3)获取session的值:session.getAttribute(“msg”);

1.设置session

	@RequestMapping("/setSession")
    public String testSetSession(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        session.setAttribute("msg", "sessionInfo");
        return "Session setting successfully";
    }

2.获取session

	@RequestMapping("/getSession")
    public String testGetSession(HttpServletRequest request, HttpServletResponse response){
        HttpSession session = request.getSession();
        Object value = session.getAttribute("msg");
        System.out.println("session值:"+value);
        return "Session obtained successfully";
    }

获取session可以看到控制台打印了刚才设置的session信息
在这里插入图片描述
3.原理
分别打开两次请求的network,首先看/setSession这次请求
在这里插入图片描述
然后看/getSession的请求
在这里插入图片描述
在客户端第一次请求时/setSession,我们创建了一个Httpsession对象,并且设置了session的信息,我们在该请求中并未手动创建cookie且发送到浏览器,但是network的信息的响应头中为什么会有cookie的信息(键是JSESSIONID),原因是session是依赖于cookie的,当请求到达服务器时,我们设置好了session信息,此时即使我们我们有手动创建cookie,服务器也会自动创建cookie对象,将JSESSIOND当作键,session的id当作值,session的id可以通过getId()获取,然后通过response将cookie发送到客户端浏览器。所以在/setSession的响应头处会有cookie的信息,这个cookie保存的就是session的id值。当客户端第二次请求/getSession时,请求会将该域名的该会话下的所有cookie信息放到请求头发送到服务器,第二张图箭头处所指,这点在cookie的原理讲解也说过。请求到达服务器,服务器会自动获取发送过来的cookie信息,拿到session的id和我们要获取的session的id做比较,如果二者相等,则我们可以通过session.getAttribute(“msg”)拿到session的信息。

4.session使用的注意事项
session将数据存放在服务器端,对数据的大小无限制,由于存在服务器端,数据相对浏览器会很安全。但是数据存在服务器的内存上,所以也要注意session的大小,避免过多的session存放在服务器造成过大的内存开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值