SpringBoot测试使用Cookie和session

Cookie介绍:
服务器发送到浏览器,并保存到浏览器端的一小块数据,大小只有4k,浏览器下次访问服务器的时候,会带着cookie,将其发送给服务器。cookie存储在浏览器,不安全

Session介绍:
在服务端HTTP状态信息的方案。服务端专门开辟一块内存来保存session,默认有效时间为30分钟,每个session都有一个唯一的sessionId,默认保存在cookie中,禁用Cookie就使用url重写,把sessionId加在url路径

当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionid(存在cookie中或者在url中),
1.如果不存在,说明是第一次请求,就会为该请求用户创建一个session对象,并将sessionid放到响应头的set-cookie中,格式set-cookie:sessionid,下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid。
2.如果存在sessionid,就会在服务器查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。

服务器的session和客户端的cookie是息息相关的,若是没有了cookie,又不做其他处理的话,服务器端的session也没了。

@Controller
@RequestMapping("/alpha")
public class AlphaController {
    //cookie示例
    @RequestMapping(path = "/cookie/set", method = RequestMethod.GET)
    @ResponseBody //返回的不是页面
    public String setCookie(HttpServletResponse response) {//cookie存到response里面
        //创建cookie,cookie存储的是 一个字符串,并且每一个对象只能存储一个key-value
        Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
        //设置cookie生效范围。即在哪条路径下有效,此路径及子路径
        cookie.setPath("/community/alpha");
        //设置生存的时间。默认是会话级别,存在内存,关闭浏览器就死。设置存活时间后会保存到硬盘
        cookie.setMaxAge(60 * 10);//10分钟
        //发送cookie,添加到response,浏览器响应的时候就带着,在响应标头responseHeaders里
        response.addCookie(cookie);

        return"我是一个cookie";
    }

    //测试浏览器第二次访问时,会不会发现上次请求的cookie。cookie在请求标头里
    @RequestMapping(path = "/cookie/get", method = RequestMethod.GET)
    @ResponseBody
    public String getCookie(@CookieValue("code") String c) {//仅获取名为code的cookie,取出来赋值给c
        System.out.println(c);
        return "我是第二次访问服务器,快查看一下有没有上次访问的cokkie";
    }
}

第一次访问,在响应标头里面
在这里插入图片描述
第二次访问(注意别超过生存时间),在请求标头里面
在这里插入图片描述

//测试session示例
    @RequestMapping(path = "/session/set", method = RequestMethod.GET)
    @ResponseBody
    public String setSession(HttpSession session) {
        session.setAttribute("id", 1);
        session.setAttribute("name", "Test");
        return "我在测试session";
    }

    @RequestMapping(path = "/session/get", method = RequestMethod.GET)
    @ResponseBody
    public String getSession(HttpSession session) {
        System.out.println(session.getAttribute("id"));
        System.out.println(session.getAttribute("name"));
        return "我是来拿session的";
    }

服务器生成session,并把sessionId放在cookie中响应给浏览器
在这里插入图片描述
浏览器下次访问的时候,会在请求头中带着cookie,cookie存储的是sessionId
在这里插入图片描述
分布式部署时,使用session会有问题

1.粘性session:有一个ip来了,分给一个服务器处理,下次相同的ip来访问,还是使用相同的服务器处理,这样就能使用上次的session。但是会有问题,负载不均衡
2.同步session:有一个服务器创建了session,同步给其他的服务器。这样服务器之间会产生关联
3.共享session:用一台服务器专门用来存储session,其他的服务器都向该服务器获取session。但是如果该服务器挂了,就gg
4.存到数据库,所有的服务器都访问数据库redis,得到会话的数据。数据库做一个集群,主从备份,不怕宕机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值