会话技术-Cookie-Session-令牌技术

本文介绍了Web会话的概念,包括客户端Cookie、服务器端Session以及令牌技术在会话跟踪中的应用。讨论了它们的优缺点,如Cookie的跨域限制和安全问题,Session在集群环境中的挑战,以及JWT如何解决这些问题。
摘要由CSDN通过智能技术生成

🌎欢迎各位点赞👍+收藏⭐️+留言📝   

概念 

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求与响应

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自与同一浏览器,以便在同一次会话的多次请求共享数据。 

会话跟踪方案:

1、客户端会话跟踪技术:Cookie

2、服务端会话跟踪技术:Session

3、令牌技术

Cookie

优点:HTTP协议中支持的技术

缺点:1、移动端app无法使用Cookie

           2、不安全,用户可以自己禁用Cookie

           3、Cookie不能跨域 (跨越分为三个维度:协议、IP/域名、端口)

@Slf4j
@RestController
public class SessionController {
    //设置Cookie
    @GetMapping("/c1")
    public Result cookie1(HttpServletResponse response) {
        response.addCookie(new Cookie("login_username", "itheima")); //设置Cookie/响应Cookie
        return Result.success();
    }

    //获取Cookie
    @GetMapping("/c2")
    public Result cookie2(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("login_username")) {
                System.out.println("login_username: " + cookie.getValue()); //输出name为login_username的cookie
            }
        }
        return Result.success();
    }
}

Sessiion 

优点:存储在服务器端,安全

缺点: 1、服务器集群环境下无法直接使用Session

            2、Cookie的缺点

@GetMapping("/s1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s1: {}", session.hashCode());

        session.setAttribute("loginUser", "tom"); //往session中存储数据
        return Result.success();
    }

    @GetMapping("/s2")
    public Result session2(HttpServletRequest request){
        HttpSession session = request.getSession();
        log.info("HttpSession-s2: {}", session.hashCode());

        Object loginUser = session.getAttribute("loginUser"); //从session中获取数据
        log.info("loginUser: {}", loginUser);
        return Result.success(loginUser);

 

 令牌技术

优点:1、支持PC端移动端

           2、解决集群环境下的认证问题

           3、减轻服务器端存储压力

缺点 :需要自己实现

组成:

第一部分:Header,记录令牌类型,签名算法等

第二部分:Payload(有效载荷),携带一些自定义信息,默认信息等

第三部分:Signature(签名),防止Token被篡改,确保安全性。将header,payload,并加入指定密钥,通过指定签名算法计算而来。

    /*
     * 生成JWT
     *
     * */
    @Test
    public void testGenJwt() {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", 1);
        claims.put("name", "tom");
        String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "g")//设置签名算法
                .setClaims(claims)//自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期
                .compact();
        System.out.println(jwt);
    }
/*
     * 解析JWT
     *
     * */
    @Test
    public void testParseJwt() {
        Claims claims = Jwts.parser().setSigningKey("g")
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwMjk5NDc5MH0.RpzLegLpFCGWcDJ6L22QGBfDuCV7-4B6HR5_IviZ-as")
                .getBody();

使用JWT时要先引入JWT的依赖 

<!--JWT令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

注意事项 

1、JWT校验时使用的签名密钥要和生成JWT时的密钥一样

2、如果JWT令牌解析校验时报错,说明JWT令牌被篡改了或失效了,令牌非法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值