Cookie和Session

一、Cookie和Session

http"无状态"协议,默认情况下,客户端和服务器的这次通信和下次通信没有直接的联系

实际生活中:登录后,第二次访问服务器就能知道该请求是否已经登陆过了

cookie客户端 session 服务器 会话跟踪(令牌)

会话:客户端和服务器不中断的请求响应,不同的客户端和服务器产生不同的会话

服务器记住区分每个请求属于哪个客户,就需要记录每个对话及用户的信息(session会保存用户信息)

服务器这边就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的⼯ 作

1)Session本质

哈希表 存储键值对(key,value)

1.当用户登录的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过 HTTP 响应中的 Set-Cookie 字段返回).

2. 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的 Cookie 字段带上).

3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的用户信息, 再进行后 续操作.找不到则重新创建Session, 并把SessionID返回

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

2)获取Cookie

    @RequestMapping("/m1")
    public String method10(HttpServletRequest request){
    // 获取所有 cookie 信息
    Cookie[] cookies = request.getCookies();
    //打印Cookie信息
    StringBuilder builder = new StringBuilder();
            if (cookies!=null){
        for (Cookie ck:cookies) {
            builder.append(ck.getName()+":"+ck.getValue());
        }
    }
            return "Cookie信息:"+builder;
}

 

 

HttpServletRequest 对象代表客户端的请求, 当客户端通过HTTP协议访问服务器时,HTTP请 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客户端请求的所有信 息. HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, 比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的方法, 可以获得服务器响应的所有内容

也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏ Cookie校验 

 

 

 

 3)session的存储和获取

Session是服务器端的机制, 我们需要先存储, 才能再获取

session 存储

@RequestMapping("/m3")
    public String setsession(HttpServletRequest request) {
        // 获取Session对象
        HttpSession session = request.getSession();
        if (session != null) {
            session.setAttribute("username", "java");
        }
        return "session 存储成功";
    }

getSession 操作内部提取到请求中的Cookie ⾥的 SessionId, 然后根据SessionId获取到对应的Session 对象

HttpSession getSession(boolean create) : 参数如果为 true, 则当不存在会话时新建会话; 参数如果 为 false, 则当不存在会话时返回 null

HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true. void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话

Session 读取

Object getAttribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名 称的对象,则返回 null.

@RequestMapping("/m4")
    public String sess(HttpServletRequest request) {
        // 如果 session 不存在, 不会⾃动创建
        HttpSession session = request.getSession(false);
        String username = null;
        if (session != null && session.getAttribute("username") != null) {
            username = (String) session.getAttribute("username");
        }
        return "username:" + username;
    }

 

@RequestMapping("/getSess")
public String sess2(@SessionAttribute(value = "username",required = false) Strin
 return "username:"+username;
}

 获取header

String userAgent = request.getHeader("User-Agent");

 

@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {
 return "userAgent:"+userAgent;
}

二.lombok

Lombok是⼀个Java⼯具库,通过添加注解的⽅式,简化Java的开发

1)引入依赖

<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
</dependency>

例: @Data注解 

@Data 注解会帮助我们⾃动⼀些⽅法, 包含getter/setter, equals, toString等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值