精华内容
下载资源
问答
  • Github项目分享——JavaGuide
    千次阅读
    2022-01-19 21:12:04

    JavaGuide

    项目地址

    https://github.com/Snailclimb/JavaGuide

    项目介绍

    Guide哥开源的java项目,「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。

    也有在线阅读版本https://javaguide.cn/

    image-20220119210514930

    涵盖一下内容(取自项目README)

    Java

    基础

    知识点/面试题 : (必看👍 ):Java 基础知识点/面试题总结

    重要知识点详解:

    集合

    1. Java 集合常见问题总结 (必看 👍)
    2. Java 容器使用注意事项总结
    3. 源码分析ArrayList 源码+扩容机制分析HashMap(JDK1.8)源码+底层数据结构分析ConcurrentHashMap 源码+底层数据结构分析

    并发

    知识点/面试题: (必看 👍)

    1. Java 并发基础常见面试题总结
    2. Java 并发进阶常见面试题总结

    重要知识点详解:

    1. 线程池Java 线程池学习总结拿来即用的 Java 线程池最佳实践
    2. ThreadLocal 关键字解析
    3. Java 并发容器总结
    4. Atomic 原子类总结
    5. AQS 原理以及 AQS 同步组件总结
    6. CompletableFuture入门

    JVM (必看 👍)

    JVM 这部分内容主要参考 JVM 虚拟机规范-Java8 和周志明老师的《深入理解Java虚拟机(第3版)》 (强烈建议阅读多遍!)。

    1. Java 内存区域
    2. JVM 垃圾回收
    3. JDK 监控和故障处理工具
    4. 类文件结构
    5. 类加载过程
    6. 类加载器
    7. 【待完成】最重要的 JVM 参数总结(翻译完善了一半)
    8. 【加餐】大白话带你认识 JVM

    新特性

    1. Java 8Java 8 新特性总结(翻译)Java8常用新特性总结
    2. Java9~Java15 : 一文带你看遍 JDK9~15 的重要新特性!

    小技巧

    1. JAD 反编译
    2. 手把手教你定位常见 Java 性能问题

    计算机基础

    👉 图解计算机基础 PDF 下载

    操作系统

    1. 操作系统常见问题总结!
    2. 后端程序员必备的 Linux 基础知识总结
    3. Shell 编程入门

    网络

    1. 计算机网络常见面试题
    2. 谢希仁老师的《计算机网络》内容总结

    数据结构

    图解数据结构:

    1. 线性数据结构 :数组、链表、栈、队列
    2. :重点关注红黑树、B-,B+,B*树、LSM树

    其他常用数据结构 :

    1. 布隆过滤器

    算法

    算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:

    常见算法问题总结

    另外,GeeksforGeeks 这个网站总结了常见的算法 ,比较全面系统。

    数据库

    MySQL

    总结:

    1. 数据库基础知识总结
    2. MySQL知识点总结 (必看 👍)
    3. 一千行 MySQL 学习笔记
    4. MySQL 高性能优化规范建议

    重要知识点:

    1. MySQL数据库索引总结
    2. 事务隔离级别(图文详解)
    3. MySQL三大日志(binlog、redo log和undo log)详解
    4. InnoDB存储引擎对MVCC的实现
    5. 一条 SQL 语句在 MySQL 中如何被执行的?
    6. 字符集详解:为什么不建议在MySQL中使用 utf8 ?
    7. 关于数据库中如何存储时间的一点思考

    Redis

    1. Redis 常见问题总结
    2. 3种常用的缓存读写策略

    搜索引擎

    用于提高搜索效率,功能和浏览器搜索引擎类似。比较常见的搜索引擎是 Elasticsearch(推荐) 和 Solr。

    系统设计

    系统设计必备基础

    RESTful API

    我们在进行后端开发的时候,主要的工作就是为前端或者其他后端服务提供 API 比如查询用户数据的 API 。RESTful API 是一种基于 REST 构建的 API,它是一种被设计的更好使用的 API。

    相关阅读:RestFul API 简明教程

    命名

    编程过程中,一定要重视命名。因为好的命名即是注释,别人一看到你的命名就知道你的变量、方法或者类是做什么的!

    相关阅读: Java 命名之道

    常用框架

    如果你没有接触过 Java Web 开发的话,可以先看一下我总结的 《J2EE 基础知识》 。虽然,这篇文章中的很多内容已经淘汰,但是可以让你对 Java 后台技术发展有更深的认识。

    Spring/SpringBoot (必看 👍)

    知识点/面试题:

    1. Spring 常见问题总结
    2. SpringBoot 入门指南

    重要知识点详解:

    1. Spring/Spring Boot 常用注解总结!安排!
    2. Spring 事务总结
    3. Spring 中都用到了那些设计模式?
    4. SpringBoot 自动装配原理?”

    MyBatis

    MyBatis 常见面试题总结

    Spring Cloud

    大白话入门 Spring Cloud

    安全

    认证授权

    《认证授权基础》 这篇文章中我会介绍认证授权常见概念: Authentication,Authorization 以及 CookieSession、Token、OAuth 2SSO 。如果你不清楚这些概念的话,建议好好阅读一下这篇文章。

    数据脱敏

    数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。

    敏感词过滤

    系统需要对用户输入的文本进行敏感词过滤如色情、政治、暴力相关的词汇。

    相关阅读:《Java定时任务大揭秘》

    定时任务

    最近有朋友问到定时任务相关的问题。于是,我简单写了一篇文章总结一下定时任务的一些概念以及一些常见的定时任务技术选型:《Java定时任务大揭秘》

    分布式

    CAP 理论和 BASE 理论

    CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。

    BASEBasically Available(基本可用)Soft-state(软状态)Eventually Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,它大大降低了我们对系统的要求。

    相关阅读:CAP 理论和 BASE 理论解读

    Paxos 算法和 Raft 算法

    Paxos 算法诞生于 1990 年,这是一种解决分布式系统一致性的经典算法 。但是,由于 Paxos 算法非常难以理解和实现,不断有人尝试简化这一算法。到了2013 年才诞生了一个比 Paxos 算法更易理解和实现的分布式一致性算法—Raft 算法

    RPC

    RPC 让调用远程服务调用像调用本地方法那样简单。

    Dubbo 是一款国产的 RPC 框架,由阿里开源。相关阅读:

    API 网关

    网关主要用于请求转发、安全认证、协议转换、容灾。

    相关阅读:

    分布式 id

    在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。比如数据量太大之后,往往需要对数据进行分库分表,分库分表后需要有一个唯一 ID 来标识一条数据或消息,数据库的自增 ID 显然不能满足需求。相关阅读:为什么要分布式 id ?分布式 id 生成方案有哪些?

    分布式事务

    分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。

    简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

    分布式协调

    ZooKeeper

    前两篇文章可能有内容重合部分,推荐都看一遍。

    1. 【入门】ZooKeeper 相关概念总结
    2. 【进阶】ZooKeeper 相关概念总结
    3. 【实战】ZooKeeper 实战

    高性能

    消息队列

    消息队列在分布式系统中主要是为了解耦和削峰。相关阅读: 消息队列常见问题总结

    1. RabbitMQ : RabbitMQ 入门
    2. RocketMQ : RocketMQ 入门RocketMQ 的几个简单问题与答案
    3. KafkaKafka 常见问题总结

    读写分离&分库分表

    读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。

    读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合单机并发读请求比较多的场景。

    分库分表是为了解决由于库、表数据量过大,而导致数据库性能持续下降的问题。

    常见的分库分表工具有:sharding-jdbc(当当)、TSharding(蘑菇街)、MyCAT(基于 Cobar)、Cobar(阿里巴巴)…。 推荐使用 sharding-jdbc。 因为,sharding-jdbc 是一款轻量级 Java 框架,以 jar 包形式提供服务,不要我们做额外的运维工作,并且兼容性也很好。

    相关阅读: 读写分离&分库分表常见问题总结

    负载均衡

    负载均衡系统通常用于将任务比如用户请求处理分配到多个服务器处理以提高网站、应用或者数据库的性能和可靠性。

    常见的负载均衡系统包括 3 种:

    1. DNS 负载均衡 :一般用来实现地理级别的均衡。
    2. 硬件负载均衡 : 通过单独的硬件设备比如 F5 来实现负载均衡功能(硬件的价格一般很贵)。
    3. 软件负载均衡 :通过负载均衡软件比如 Nginx 来实现负载均衡功能。

    高可用

    高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的 。

    相关阅读: 如何设计一个高可用系统?要考虑哪些地方?

    限流

    限流是从用户访问压力的角度来考虑如何应对系统故障。

    限流为了对服务端的接口接受请求的频率进行限制,防止服务挂掉。比如某一接口的请求限制为 100 个每秒, 对超过限制的请求放弃处理或者放到队列中等待处理。限流可以有效应对突发请求过多。相关阅读:何为限流?限流算法有哪些?

    降级

    降级是从系统功能优先级的角度考虑如何应对系统故障。

    服务降级指的是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

    熔断

    熔断和降级是两个比较容易混淆的概念,两者的含义并不相同。

    降级的目的在于应对系统自身的故障,而熔断的目的在于应对当前系统依赖的外部系统或者第三方系统的故障。

    排队

    另类的一种限流,类比于现实世界的排队。玩过英雄联盟的小伙伴应该有体会,每次一有活动,就要经历一波排队才能进入游戏。

    集群

    相同的服务部署多份,避免单点故障。

    超时和重试机制

    一旦用户的请求超过某个时间得不到响应就结束此次请求并抛出异常。 如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法在处理请求。

    重试的次数一般设为 3 次,再多的重试次数没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。在一次重试失败之后通常会加上一个时间间隔 delay 再进行下一次重试,时间间隔 delay 通常建议是随机的。

    并且,为了更好地保护下游,我们还可以结合断路器。

    灾备设计和异地多活

    灾备 = 容灾+备份。

    • 备份 : 将系统所产生的的所有重要数据多备份几份。
    • 容灾 : 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。

    异地多活 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者认为灾害。

    相关阅读:

    开发工具

    数据库

    Git

    Docker

    Git

    Docker

    更多相关内容
  • 但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将 SessionID 放在请求的 url 里面https://javaguide.cn/?Session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了你也可以对 ...

    大家好,我是 Guide哥!端午已过,又要开始工作学习啦!

    我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证、JWT 以及 Cookie 这些概念。

    所以,根据我根据日常对这部分学习已经在项目中的实际运用总结了这 13 个相关的问题并且附上了详细的回答。希望能够对大家有帮助!

    认证 (Authentication) 和授权 (Authorization)的区别是什么?

    这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。

    说简单点就是:

    • 认证 (Authentication): 你是谁。
    • 授权 (Authorization): 你有权限干什么。

    稍微正式点(啰嗦点)的说法就是 :

    • Authentication(认证) 是验证您的身份的凭据(例如用户名/用户 ID 和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。
    • Authorization(授权) 发生在 Authentication(认证) 之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如 admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。

    认证 :

    授权:

    这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。

    RBAC 模型了解吗?

    系统权限控制最常采用的访问控制模型就是 RBAC 模型

    什么是 RBAC 呢?

    RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权的方式。

    简单地说:一个用户可以拥有若干角色,每一个角色有可以被分配若干权限这样,就构造成“用户-角色-权限” 的授权模型。在这种模型中,用户与角色、角色与权限之间构成了多对多的关系,如下图

    RBAC

    在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

    通常 RBAC 下的权限设计相关的表有5 张,其中有 2 张用于建立表之间的联系:

    通过这个权限模型,我们可以创建不同的角色并为不同的角色分配不同的权限范围(菜单)。

    通常来说,如果系统对于权限控制要求比较严格的话,一般都会选择使用 RBAC 模型来做权限控制。

    计算机基础相关书籍电子版我已经整理好了,需要的小伙伴自取

    什么是 Cookie ? Cookie 的作用是什么?

    CookieSession 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。

    维基百科是这样定义 Cookie 的:

    Cookies 是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。

    简单来说: Cookie 存放在客户端,一般用来保存用户信息

    下面是 Cookie 的一些应用案例:

    1. 我们在 Cookie 中保存已经登录过的用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。
    2. 使用 Cookie 保存 Session 或者 Token ,向后端发送请求的时候带上 Cookie,这样后端就能取到 Session 或者 Token 了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。
    3. Cookie 还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为 HTTP 协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在 Cookie

    如何在项目中使用 Cookie 呢?

    我这里以 Spring Boot 项目为例。

    1)设置 Cookie 返回给客户端

    @GetMapping("/change-username")
    public String setCookie(HttpServletResponse response) {
        // 创建一个 cookie
        Cookie cookie = new Cookie("username", "Jovan");
        //设置 cookie过期时间
        cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days
        //添加到 response 中
        response.addCookie(cookie);
    
        return "Username is changed!";
    }
    

    2) 使用 Spring 框架提供的 @CookieValue 注解获取特定的 cookie 的值

    @GetMapping("/")
    public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) {
        return "Hey! My username is " + username;
    }
    

    3) 读取所有的 Cookie

    @GetMapping("/all-cookies")
    public String readAllCookies(HttpServletRequest request) {
    
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            return Arrays.stream(cookies)
                    .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));
        }
    
        return "No cookies";
    }
    

    更多关于如何在 Spring Boot 中使用 Cookie 的内容可以查看这篇文章:How to use cookies in Spring Boot

    Cookie 和 Session 有什么区别?

    Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

    Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。为了保证 Cookie中信息的安全性,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

    那么,如何使用 Session 进行身份验证?

    如何使用 Session-Cookie 方案进行身份验证?

    很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:

    1. 用户成功登陆系统,然后返回给客户端具有 SessionIDCookie
    2. 当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。

    关于这种认证方式更详细的过程如下:

    1. 用户向服务器发送用户名、密码、验证码用于登陆系统。
    2. 服务器验证通过后,服务器为用户创建一个 Session,并将 Session 信息存储起来。
    3. 服务器向用户返回一个 SessionID,写入用户的 Cookie
    4. 当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。
    5. 服务器可以将存储在 Cookie 上的 SessionID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。

    使用 Session 的时候需要注意下面几个点:

    1. 依赖 Session 的关键业务一定要确保客户端开启了 Cookie
    2. 注意 Session 的过期时间。

    另外,Spring Session 提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章:

    多服务器节点下 Session-Cookie 方案如何做?

    Session-Cookie 方案在单体环境是一个非常好的身份认证方案。但是,当服务器水平拓展成多节点时,Session-Cookie 方案就要面临挑战了。

    举个例子:假如我们部署了两份相同的服务 A,B,用户第一次登陆的时候 ,Nginx 通过负载均衡机制将用户请求转发到 A 服务器,此时用户的 Session 信息保存在 A 服务器。结果,用户第二次访问的时候 Nginx 将请求路由到 B 服务器,由于 B 服务器没有保存 用户的 Session 信息,导致用户需要重新进行登陆。

    我们应该如何避免上面这种情况的出现呢?

    有几个方案可供大家参考:

    1. 某个用户的所有请求都通过特性的哈希策略分配给同一个服务器处理。这样的话,每个服务器都保存了一部分用户的 Session 信息。服务器宕机,其保存的所有 Session 信息就完全丢失了。
    2. 每一个服务器保存的 Session 信息都是互相同步的,也就是说每一个服务器都保存了全量的 Session 信息。每当一个服务器的 Session 信息发生变化,我们就将其同步到其他服务器。这种方案成本太大,并且,节点越多时,同步成本也越高。
    3. 单独使用一个所有服务器都能访问到的数据节点(比如缓存)来存放 Session 信息。为了保证高可用,数据节点尽量要避免是单点。

    如果没有 Cookie 的话 Session 还能用吗?

    这是一道经典的面试题!

    一般是通过 Cookie 来保存 SessionID ,假如你使用了 Cookie 保存 SessionID 的方案的话, 如果客户端禁用了 Cookie,那么 Session 就无法正常工作。

    但是,并不是没有 Cookie 之后就不能用 Session 了,比如你可以将 SessionID 放在请求的 url 里面https://javaguide.cn/?Session_id=xxx 。这种方案的话可行,但是安全性和用户体验感降低。当然,为了你也可以对 SessionID 进行一次加密之后再传入后端。

    为什么 Cookie 无法防止 CSRF 攻击,而 Token 可以?

    CSRF (Cross Site Request Forgery)一般被翻译为 跨站请求伪造 。那么什么是 跨站请求伪造 呢?说简单用你的身份去发送一些对你不友好的请求。举个简单的例子:

    小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了 10000 元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。

    <a src=http://www.mybank.com/Transfer?bankId=11&money=10000>科学理财,年盈利率过万</>
    

    上面也提到过,进行 Session 认证的时候,我们一般使用 Cookie 来存储 SessionId,当我们登陆后后端生成一个 SessionId 放在 Cookie 中返回给客户端,服务端通过 Redis 或者其他存储工具记录保存着这个 SessionId,客户端登录以后每次请求都会带上这个 SessionId,服务端通过这个 SessionId 来标示你这个人。如果别人通过 Cookie 拿到了 SessionId 后就可以代替你的身份访问系统了。

    Session 认证中 Cookie 中的 SessionId 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。

    但是,我们使用 Token 的话就不会存在这个问题,在我们登录成功获得 Token 之后,一般会选择存放在 localStorage (浏览器本地存储)中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 Token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 Token 的,所以这个请求将是非法的。

    需要注意的是不论是 Cookie 还是 Token 都无法避免 跨站脚本攻击(Cross Site Scripting)XSS

    跨站脚本攻击(Cross Site Scripting)缩写为 CSS 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为 XSS。

    XSS 中攻击者会用各种方式将恶意代码注入到其他用户的页面中。就可以通过脚本盗用信息比如 Cookie

    推荐阅读:如何防止 CSRF 攻击?—美团技术团队

    什么是 Token?什么是 JWT?

    我们在前面的问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖 Cookie)等等。

    有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。

    JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。

    下面是 RFC 7519 对 JWT 做的较为正式的定义。

    JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——JSON Web Token (JWT)

    JWT 由 3 部分构成:

    1. Header : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。
    2. Payload : 用来存放实际需要传递的数据
    3. Signature(签名) :服务器通过PayloadHeader和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。

    如何基于 Token 进行身份验证?

    在基于 Token 进行身份验证的的应用程序中,服务器通过PayloadHeader和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization 字段中:Authorization: Bearer Token

    jwt

    1. 用户向服务器发送用户名和密码用于登陆系统。
    2. 身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。
    3. 用户以后每次向后端发请求都在 Header 中带上 JWT。
    4. 服务端检查 JWT 并从中获取用户相关信息。

    什么是 SSO?

    SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中一个就有权访问与其相关的其他系统。举个例子我们在登陆了京东金融之后,我们同时也成功登陆京东的京东超市、京东国际、京东生鲜等子系统。

    sso

    什么是 OAuth 2.0?

    OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而 OAuth 2.0 是对 OAuth 1.0 的完全重新设计,OAuth 2.0 更快,更容易实现,OAuth 1.0 已经被废弃。详情请见:rfc6749

    实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 Token,使得第三方应用能够通过该令牌获取相关的资源。

    OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。

    另外,现在 OAuth 2.0 也常见于支付场景(微信支付、支付宝支付)和开发平台(微信开放平台、阿里开放平台等等)。

    微信支付账户相关参数:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqIC91bs-1623925796543)(./images/basis-of-authority-certification/微信支付-fnglfdlgdfj.png)]

    下图是 Slack OAuth 2.0 第三方登录的示意图:

    推荐阅读:

    花了半个月写的最新版 Java学习路线已近更新!可能是你看过最用心、最全面的 Java 后端学习路线。

    最适合新手的Java系统学习路线!

    我是 Guide哥,拥抱开源,喜欢烹饪。开源项目 JavaGuide 作者,Github:Snailclimb - Overview 。未来几年,希望持续完善 JavaGuide,争取能够帮助更多学习 Java 的小伙伴!共勉!凎!点击查看我的2020年工作汇报!

    原创不易,欢迎点赞分享,欢迎关注 @JavaGuide,我会持续分享原创干货~

    本回答为我本人原创,如需转载,还请注明出处啊!

    展开全文
  • V2.0 版本的 《JavaGuide面试突击版》来啦,带着它的在线阅读版本来啦! 历史更新查看: 完结撒花!JavaGuide面试突击版来啦! V1.1版JavaGuide面试突击来啦!这个更新真的太棒了! 这次更新,应大家需求,我将...

    大家好!我是 Guide 哥!V2.0 版本的 《JavaGuide面试突击版》来啦,带着它的在线阅读版本来啦!

    历史更新查看:

    1. 完结撒花!JavaGuide面试突击版来啦!
    2. V1.1版JavaGuide面试突击来啦!这个更新真的太棒了!

    这次更新,应大家需求,我将《JavaGuide面试突击版》的所有内容更新到了Github以及码云上。并且利用 Docisfy 部署了一个在线版本。有没有很贴心?哈哈!在看走起?

    在线阅读版本的阅读体验可以说也非常棒!

    在线阅读地址:https://snailclimb.gitee.io/javaguide-interview/#/

    详细的目录:

    搜索功能:

    这次除了提供了在线阅读版本之外,还有下面这些重要的更新。

    修复问题:

    • 修复了部分错别字,这部分对整体阅读影响不大所以不做过多阐述。
    • 增加了页码

    增加/修改内容:

    获取暗号还是在公众号"JavaGuide"后台回复“面试突击”。

    作者介绍: Github 70k Star 项目 JavaGuide(公众号同名) 作者。每周都会在公众号更新一些自己原创干货。公众号后台回复“1”领取Java工程师必备学习资料+面试突击pdf。

    展开全文
  • 不瞒大家说,通过写作,我认识了太多太多优秀的年轻人,JavaGuide 就是其中的一位——胖嘟嘟的小可爱,在 GitHub 上开源的同名项目足足有 98.1k 的星标,实名羡慕了! 2021 年的 1 月份,他的《JavaGuide 面试突击版...

    不瞒大家说,通过写作,我认识了太多太多优秀的年轻人,JavaGuide 就是其中的一位——胖嘟嘟的小可爱,在 GitHub 上开源的同名项目足足有 98.1k 的星标,实名羡慕了!

    2021 年的 1 月份,他的《JavaGuide 面试突击版》V4.0 版本就更新了,我第一时间就拿到了离线版(文末有提供下载地址),不得不说,阅读体验比之前的版本更舒服了,简直有点爱不释手。

    之所以过了一个月才分享出来,是因为这一个月我一直在刷这份面试攻略,倒不是为了跳槽,而是为了学习,进一步巩固面试中常见的这些知识点。

    新增了校招/社招面试指南、程序员简历之道这些大多数程序员在面试前比较关心的内容:

    • Java 基础、集合、多线程、JVM 部分进行了重构和完善
    • 增加了 18 道最常见的 Spring Boot 面试题
    • 增加了 3 个月上岸百度、华为|字节|腾讯|京东|网易|滴滴的面经

    我和 Guide 哥的关系也非常不错,经常听他说不少小伙伴是通过他的这份面试突击找到的工作,心里面由衷的对他表示敬佩。据他说,他是在大三的就是就开始维护这个开源项目了,想想我大三的时候在做什么,实在是惭愧。

    V4.0 版本的 《JavaGuide 面试突击版》 的相关地址我也贴一下。

    Github 地址:https://github.com/Snailclimb/JavaGuide-Interview

    在线阅读地址:https://snailclimb.gitee.io/javaguide-interview

    由于 CSDN 对外链有限制,所以只能采取迂回战术给大家提供三种下载方式:

    第一种,微信搜索「沉默王二」或者扫描下面的二维码,关注后回复关键字「1024」拉取下载地址(没有解压密码,无套路)。

    微信搜索「沉默王二」
    第二种,通过 CSDN 自家的开源广场下载,文件名叫《JavaGuide 面试突击》,在面试大类下。

    https://codechina.csdn.net/mirrors/itwanger/JavaBooks

    里面还有一些其他的面试资料,还是很值得 get 的,至少配得上收藏夹吃灰吧!

    第三种:用 CSDN 下载:https://download.csdn.net/download/qing_gee/15723542

    不管怎么说,真的非常希望这份面试攻略能够帮助大家成功上岸!

    展开全文
  • JavaGuide--Java篇

    2022-02-13 15:59:12
    JavaGuider:https://javaguide.cn/java/basis/java-basic-questions-01/ JVM内存结构:https://blog.csdn.net/rongtaoup/article/details/89142396 文章目录????1.基础概念与常识1.1.Java语言特点1.2...
  • JavaGuide

    2021-03-18 11:19:26
    本文已经收录进 Github 95k+ Star 的Java项目JavaGuideJavaGuide项目地址 : https://github.com/Snailclimb... 。每次问到 Spring Boot, 面试官非常喜欢问这个问题:“讲述一下 SpringBoot 自动装配原理?”。我...
  • 面试总结(JavaGuide)

    千次阅读 2020-08-20 10:35:40
    DispathcherServletHashMap的底层实现 JDK1.8之前 底层的实现是数组+链表 结合一起使用,也就是散列表 拉链法:创建一个链表数组,数组中每一格就是一个链表。 若遇到哈希冲突,则将冲突的值写入到链表中即可。...
  • Netty 进行传输): /** * Server: Automatic registration service via @RpcService annotation * * @author shuang.kou * @createTime 2020年05月10日 07:25:00 */ @RpcScan(basePackage = {"github.javaguide....
  • 深入理解JavaGuide面试突击版

    千次阅读 2020-12-03 14:09:01
    本文为《JavaGuide面试突击版》的阅读笔记,会带有笔者的理解和一些扩展的东西。 作者公众号:JavaGuide 原作链接:https://github.com/Snailclimb/JavaGuide Java基础+集合+多线程+JVM 1. 面向对象和面向过程的区别...
  • javaguide及面试突击

    2022-03-08 16:09:03
    1.字符型常量和字符串常量的区别? (形式、含义、占内存大小) 2.使用过可变长参数吗?遇到方法重载时,会优先匹配固定参数还是可变参数的方法呢?Java可变参数编译后会被转换成什么? 3.静态方法和实例方法有何...
  • 整理gitHub项目JavaGuide-CSDN版

    千次阅读 2020-09-22 10:48:04
    Java 项目历史月榜单 说明 JavaGuide介绍 开源 JavaGuide 初始想法源于自己的个人那一段比较迷茫的学习经历。主要目的是为了通过这个开源平台来帮助一些在学习 Java 或者面试过程中遇到问题的小伙伴。 对于 Java ...
  • JavaGuide面试突击最新版.pdf
  • JavaGuide知识点总结

    千次阅读 2021-03-09 11:35:41
    一、Java基础 基本类型:int、long、short、byte、char、double、float、bool 包装类型:Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail BigInteger、BigDecimal没有...
  • 目前Guide哥更新的是第四版本主要包括: 1. Java 核⼼知识总结; 2. ⾯试⽅向:⾯试题、⾯试经验、备战⾯试系列⽂章以及⾯试真实体验系列⽂
  • JavaGuide-(收藏)

    千次阅读 2021-02-12 15:06:41
    在本篇文章中,你将掌握最常用的 JVM 参数配置。如果对于下面提到了一些概念比如堆、Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是...
  • 本笔记为JavaGuide哥RPC项目的学习笔记,感谢Guide哥的无私奉献! RPC,Remote Procedure Call,远程过程(方法)调用,本地上某个服务的方法要调用远程主机上某个服务的方法。 RPC的原理。简单讲主要涉及三个问题:...
  • java8 源码 目录 Java 基础 容器 并发 JVM I/O Java 8 优雅 Java ...JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一个初步认识
  • Java面试,基础,集合,多线程,jvm,计算机基础,数据库面试,常用框架面世,认证授权,微服务,分布式等
  • 面试突击
  • 花了比较长时间去搜索以及对比,希望能对JavaGuide的小可爱们的有帮助!ღ( ´・ᴗ・` )比心 如果有帮助的话,不要吝啬你们手中的在看和赞!“怼”起来! 以上开源项目的压缩包,公众号 “后端面试进阶” 后台回复...
  • JavaGuide面试突击版原创不易,你的认可就是我前进路上最大的动力。欢迎关注我的公众号: JavaGuide 获取更多优质原创内容!如果文章有任何需要改善和完善的地方,欢迎在评论区指出,共同进步!如何学习本项目提供了...
  • 为此,特地整理了一份 GitHub 上标星 98.1k《JavaGuide 面试突击版 V4.0》来啦!BAT通关手册,厉害! 其实,通过写作和技术分享,猿人结交了不少朋友,包括在校大学生,同行朋友,以及想让我帮忙做私活的朋友。在...
  • 介绍:关于 JavaGuide 的相关介绍请看: 。 PDF版本 : 。。 知识星球 : 简历指导/Java学习/面试指导/面试小册。欢迎加入 。星球内部更新的这个小册的质量很高,专为面试打造。 面试专版 :准备面试的小伙伴可以考虑...
  • JavaGuide集合汇总

    千次阅读 2019-09-06 14:30:04
    一 ,List Set Map三者的区别 List(注重有序):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象。 Set(注重独一无二):不允许重复的集合,不会有多个元素引用相同的对象。...
  • JavaGuide.pdf

    2021-10-09 09:31:41
    比较全面的面试题
  • 摊牌了!我要手写一个“Spring Boot”

    万次阅读 多人点赞 2020-09-29 17:26:54
    目前的话,已经把 Spring MVC 相关常用的注解比如@GetMapping 、@PostMapping 、@PathVariable 写完了。...原创开源不易,觉得不错的话,欢迎给良心作者 1 个 star 鼓励一下!...01 重构 JavaGuide 我.
  • JavaGuide 地址 https://github.com/Snailclimb/JavaGuide 中文学习文档 https://javaguide.cn/java/basis/java-basic-questions-01/#
  • 本文根据javaGuide 基础知识(上)编写 建议阅读本文之前看下原文的目录 原文链接:https://javaguide.cn/java/basis/java-basic-questions-01/# 1. java有哪些特点? 像跨平台”一次编写到处运行“这些就不罗嗦了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,225
精华内容 2,090
关键字:

javaguide

java 订阅
友情链接: NDG.zip