登录验证

目录

会话技术

 Cookie

Session

JWT

JWT生成

JWT校验


会话技术

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

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

会话跟踪方案 

        客户端会话跟踪技术 Cookie

        服务端会话跟踪技术 Session

        令牌技术

 Cookie

优点  HTTP协议中支持的技术

缺点 移动端App无法使用Cookie

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

        Cookie不能跨域(跨域 : 协议,IP/域名,端口中有不同的)

@Slf4j
@RestController
public class SessionController {

    @GetMapping("/c1")
    public Result cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("login_username","awaw"));
        return Result.success();
    }

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

Session

优点 存储在服务器 安全

缺点 服务器集群情况下无法直接使用Session

        移动端App无法使用Session

         不安全,用户可以自己禁用Session

        Session不能跨域

@Slf4j
@RestController
public class SessionController {
    @GetMapping("/s1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s2:{}",session.hashCode());
        session.setAttribute("loginUser","tom");
        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");
        log.info("loginUser: {}",loginUser);
        return Result.success(loginUser);
    }
}

JWT

Json Web Token

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

 组成

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

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

        第三部分 Signature 签名:防止Token被修改,确保安全性。将header,Payload加入执行密匙,通过指定签名算法计算而来

优点

        支持PC端,移动端

        解决集群问题下的认证问题

        减轻服务器存储压力

 在pom.xml中引入JWT令牌依赖

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

JWT生成

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    @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,"awaw")//签名算法
                .setClaims(claims)//自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 10000))//有效期
                .compact();
        System.out.println(jwt);
    }
}

JWT校验

JWT检验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的 

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    private EmpMapper empMapper;
    
    @Test
    public void testParseJwt(){
        Claims claims = Jwts.parser()
                .setSigningKey("awaw")//指定签名密匙
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwNDY0NjU4OH0.EKF6hnJvMExOBaJHE71OZmQBN0Sbcc3sH9FHkBq8sDY")//解析令牌
                .getBody();
        System.out.println(claims);
    }
}

相关推荐

  1. gin使用jwt登录验证

    2024-01-09 22:34:01       63 阅读
  2. js登陆验证

    2024-01-09 22:34:01       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-09 22:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-09 22:34:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-09 22:34:01       82 阅读
  4. Python语言-面向对象

    2024-01-09 22:34:01       91 阅读

热门阅读

  1. 发音纠正(每日职场英语)

    2024-01-09 22:34:01       56 阅读
  2. AI智能电销器人需要注意哪些问题呢

    2024-01-09 22:34:01       53 阅读
  3. 使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

    2024-01-09 22:34:01       50 阅读
  4. 变量和函数提升(js的问题)

    2024-01-09 22:34:01       68 阅读
  5. 运行时类型信息 typeid、type_info...(C++)

    2024-01-09 22:34:01       57 阅读
  6. Go语言实现数据结构栈和队列

    2024-01-09 22:34:01       41 阅读
  7. linux 网络驱动之net_device 结构介绍

    2024-01-09 22:34:01       48 阅读
  8. Python基础(二):数值类型及其运算

    2024-01-09 22:34:01       61 阅读
  9. 关于Tomcat源码学习 这里是一些建议

    2024-01-09 22:34:01       52 阅读