Web会话技术

news/2024/7/7 21:54:23

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

cookie

    // 设置cookies
    @GetMapping("/c1")
    public Result cookiel(HttpServletResponse response)
    {
        response.addCookie(new Cookie("login_username","ztt"));
        return Result.success();
    }

    // 获取cookies
    @GetMapping("/c2")
    public Result cookies(HttpServletRequest request)
    {
        Cookie[] cookie2 = request.getCookies();

        for (Cookie cookie:cookie2)
        {
            if (cookie.getName().equals("login_username"))
                System.out.println("login_username:"+cookie.getValue());

        }
        return  Result.success();
    }

cookie优点:
HTTP协议支持的技术
cookie缺点:
1.移动端APP无法使用cookie
2.cookies不支持跨域
3.不安全,同时用户可以自己禁用cookie

Session

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

        session.setAttribute("loginUser","tom");
        return Result.success();
    }

    //从HTTPsession中获取值
    public Result session2(HttpServletRequest request)
    {
        HttpSession session = request.getSession();
        log.info("HttpSession-s2{}",session.hashCode());

        Object loginUser = session.getAttribute("loginUser");
        log.info("loginUser:{}",loginUser);
        return Result.success(loginUser);
    }

session优点:
存储在服务器上,安全
session缺点:
1.服务器集群环境下无法直接使用session
2.cookie的缺点

令牌技术

JWT 令牌

JSON web Token

其定义了一种简洁、自包含的格式,用于在通信双方以JSON数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

一般的JWT如下所示:
在这里插入图片描述

第一部分: Header(头),记令牌类型、签名算法等,例如{“alg”:HS256,“type”:“JWT”)
第二部分: Payload(有效载荷)携带一些自定义信息默认信息等。 例如{“id”:“1”,“username”:“Tom”}
第三部分: Signature(签名)防止Token被篡改、确保安全性。将header、payload并加入指定秘钥,通过指定签名算计算而来。

使用场景:
在登录任务中,用户登录成功后会服务器会为用户生成令牌;后续每个请求用户都要携带JWT令牌,系统在每次请求处理之前,需要先校验令牌,令牌通过后再进行处理。

令牌技术优点:
支持PC、移动端
解决集群环境下的认证问题
减轻服务端存储压力
令牌技术缺点:
需要自己开发与实现

<!--JWP令牌依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.1</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
        </dependency>
    @Test
    public void testGenjwt()
    {
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("name","tom");
        
        // ztt1232dksjhfskjdfmksjfksjdnfsdnfsfdsfaslkfdjskdjmfksjmadjcfk这个是key
        String jwt = Jwts.builder()
                        .signWith(SignatureAlgorithm.HS256,"ztt1232dksjhfskjdfmksjfksjdnfsdnfsfdsfaslkfdjskdjmfksjmadjcfk")  //签名算法
                .setClaims(claims)   //用户自定义内容,载荷部分

                .setExpiration(new Date(System.currentTimeMillis()+3600*1000))  // 设置有效日期,定义为1h内有效
                .compact();
        System.out.println(jwt);
    }
// jwt解析
    @Test
    public void testParseJWT()
    {
        Claims claims = Jwts.parser()
                .setSigningKey("ztt1232dksjhfskjdfmksjfksjdnfsdnfsfdsfaslkfdjskdjmfksjmadjcfk")
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5MjU0MTMxOH0.jr3pjQ9SxObgxzljrF5fpMP_A0zPLyk73yFuFd8sI2U")
                .getBody();
        System.out.println(claims);
    }

输出

eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY5MjU0MTMxOH0.jr3pjQ9SxObgxzljrF5fpMP_A0zPLyk73yFuFd8sI2U
同时这段编码也可以在JWT官网下解析出来,exp表示的是时间
在这里插入图片描述

注意:新版本的JWT对签名密钥长度做了要求;JWT 使用签名算法来保证 token 的完整性和认证,而对于 HS256 签名算法来说,密钥的长度必须 >= 256 位(32 字节),以确保安全性。
如果长度不足就会报这样的错误:
io.jsonwebtoken.security.WeakKeyException: The signing key’s size is 16 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HS256 MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys class’s ‘secretKeyFor(SignatureAlgorithm.HS256)’ method to create a key guaranteed to be secure enough for HS256. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.


http://lihuaxi.xjx100.cn/news/1465336.html

相关文章

(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(10)

1003 Many Topological Problems 每个节点序号和权值分开计算,两者的排列组合数相乘即为答案 对于序号的顺序,一共有n个位置,第一个位置可以放序号1,2,..n共n个点,第二个则可放置n-1个点,以此类推,排列组合数为n的阶乘 对于权值,从小到大放置,如果不考虑k的话,对于权值为x的数,…

【福建事业单位-综合基础知识】05民法典

这里写自定义目录标题 一、民法概述概念原则总结 二、自然人概念总结 三、民事法律行为总结 民法考察2-4题&#xff08;重点总则篇&#xff09; 一、民法概述 概念原则 总结 二、自然人 概念 总结 三、民事法律行为 总结

最新ChatGPT网站程序源码+AI系统+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库

一、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01…

resource doesn‘t have a corresponding Go package.

resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …

苹果iOS17引入新功能:实时显示充电设施信息,续航焦虑不再

据外媒9to5mac报道&#xff0c;苹果公司计划在iOS 17中引入一项非常方便电动汽车车主的功能&#xff0c;即iPhone内置的地图应用将实时显示充电设施的可用性信息。在最新发布的iOS 17 Beta 1版本中&#xff0c;这一功能仍在开发阶段&#xff0c;尚缺少一些必要的数据。 据称&am…

js中的正则表达式(一)

目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法&#xff1a; 1.什么是正则表达式 正则表达式(Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替换那些符…

HTTP连接管理

基础知识&#xff1a;非持久连接 HTTP初始时1.0版本在浏览器每一次向服务器请求完资源都会立即断开TCP连接&#xff0c;如果想要请求多个资源&#xff0c;就必须建立多个连接&#xff0c;这就导致了服务端和客户端维护连接的开销。 例如&#xff1a;一个网页中包含文字资源也包…

记录首次面试2023-08-18

人生第一次面试&#xff0c;大概一个小时左右。没有问我C的&#xff0c;上来一个数据库事务&#xff0c;虽然没有复习&#xff0c;但是还是能够记住一些&#xff0c;主要问的一些事务的隔离级别&#xff0c;以及都有什么作用&#xff0c;我是举例回答的&#xff0c;客户端A和客…