Java常见的会话技术(Cookie,Session,JWT.)

本文探讨了浏览器与服务器间会话的基本概念,重点介绍了Cookie、Session和JWT三种会话技术的优缺点,包括移动端兼容性、安全性和集群环境下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

浏览器与服务器之间的一次连接,我们就称为一次会话,用户打开浏览器第一次访问服务器的时候,这个会话就建立了,直到有任何一方断开连接,此时会话就结束了。在一次会话当中,是可以包含多次请求和响应的。常见的会话技术有Cookie,Session,JWT.

2.Cookie
  • 优点:HTTP协议中支持的技术

  • 缺点:

    • 移动端APP(Android、IOS)中无法使用Cookie

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

    • Cookie不能跨域

 以下代码我么可以获取当浏览器发送请求 再到获取cookie  cookie是将信息储存到这个浏览器的,用户是可以关闭的.(安全性较低)

 //cookie 请求
    @GetMapping("/c1")
    public Result addCookie(String cookieName, HttpServletResponse response){
        //浏览器添加
        response.addCookie(new Cookie("goods",cookieName));
        return Result.success();
    }
    //获取cookie
    @GetMapping("/c2")
    public Result getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("goods")){
                return Result.success();
            }
        }
        return Result.success();
    }

 

3.Session 

优缺点

  • 优点:Session是存储在服务端的,安全

  • 缺点:

    • 服务器集群环境下无法直接使用Session

    • 移动端APP(Android、IOS)中无法使用Cookie

    • 用户可以自己禁用Cookie

    • Cookie不能跨域

  以下代码我么可以获取当浏览器发送请求 再到获取session  session是将信息储存到这个服务器的,但是同样是继承了cookie,所以用户是可以关闭的.

 @GetMapping("/addSession")
    public Result add(String goodName, HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("goods",goodName);
        return Result.success();
    }
    @GetMapping("/getSession")
    public Result get(HttpServletRequest request){
        HttpSession session = request.getSession();
        Object goods = session.getAttribute("goods");
        log.info("获得的商品名,{}",goods);
        return Result.success();
    }

4.JWT令牌技术

优缺点

  • 优点:

    • 支持PC端、移动端

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

    • 减轻服务器的存储压力(无需在服务器端存储)

  • 缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)

1.在Java中我们首先要使用jwt,需要引入依赖
<dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
 2.生成token
@Test
    public void jwt(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("id",1);
        map.put("name","小明");
        String jwt = Jwts.builder()//获取token的生成构建者
                .signWith(SignatureAlgorithm.HS256, "私钥")//设置签名的算法和签名的私钥
                .addClaims(map)//设置载荷数据(需要什么数据放在token,就放什么)
                .setExpiration(new Date(System.currentTimeMillis()+1200*1000*12))//设置间隔时间
                .compact();//构建
        System.out.println("生成的token为:"+jwt);
    }
3.解析token
@Test
    public void jwtAnalysis(){
        Claims claims = Jwts.parser()//获取的是解析器
                .setSigningKey("aXRjYXN0")//设置的解析签名的私钥
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6buR6amsIiwiaWQiOjEsImV4cCI6MTcxNDEyMTY3OH0.**************私钥生成的数字签名*****************")
                .getBody();//获取到解析的数据中的荷载部分数据
        System.out.println("获取的荷载数据:"+claims);

    }
注意

篡改令牌中的任何一个字符,在对令牌进行解析时都会报错,所以JWT令牌是非常安全可靠的,同时令牌也是有时效性的,需要注意时间是否过期.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值