【Git】Git 常用命令

常用命令

1
2
3
4
5
6
7
8
9
10
11
git init

git remote add origin 远程仓库地址

git add .

git commit -m "..."

git push -u origin master

git pull origin master

在远程分支与本地分支之间建立联系

在本地分支新创建的分支没有与远程分支建立联系,需要使用以下指令建立本地分支与远程分支的联系,之后即可 pull

1
2
3
4
5
git checkout -b dev

git branch --set-upstream-to=origin/dev dev

git pull origin dev

更新远程分支列表

在远程仓库的分支发生变化而本地仓库的分支没有更新时使用

1
2
git remote update origin --prune
git fetch --all

Git 基本原理

工作区域

Git 本地有三个工作区域:

  • 工作目录(Working Directory):平时存放项目代码的地方
  • 暂存区(Stage / Index):用于临时存放你的改动,事实上他只是一个文件,保存即将提交的文件列表信息
  • 资源库(Repository 或 Git Directory):安全存放数据的地方,这里面有你提交到所有版本的数据,其中 head 指向最新放入仓库的版本

如果再加上远程的 git 仓库(Remote Directory),就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

img

创建工作目录与常用命令

img

文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked:未跟踪,此文件在文件夹中,但没有加入到git库,不参与版本控制,通过 git add 状态变为 Staged
  • Staged:暂存状态,执行了 git commit 则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为 Unmodified 状态,执行 git reset HEAD filename 取消暂存,文件状态为Modified
  • Unmodify:文件已入库,未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果他被修改而变为 Modified,如果使用 git rm 移出版本库,则成为 Untracked 文件
  • Modified:文件已修改,仅仅是修改,并没有进行其他操作,这个文件也有两个去处,通过 git add 可进入暂存 Staged 状态,使用 git checkout 则丢弃修改过,返回到 Unmodify 状态,这个 git checkout 即从库中取出文件,覆盖当前修改

查看文件状态

上面说文件有四种状态,通过如下命令可以查看到文件的状态

1
2
3
4
5
6
7
8
9
10
11
# 查看指定文件状态
git status [filename]

# 查看所有文件状态
git status

# 添加所有文件到暂存区
git add .

# 提交暂存区中的内容到本地仓库
git commit -m "消息内容"

各种疑难杂症解决方案

Failed to connect to github.com port 443:connection timed out

这种报错很多是因为使用了梯子所导致的代理问题,解决方案:重新设置本地代理的端口号(Clash里代理端口号为7890)

1
2
git config --global http.proxy http://127.0.0.1:7890 
git config --global https.proxy http://127.0.0.1:7890

【JavaWeb】JWT

JWT

JWT(JSON Web Token)是一个开放的行业标准(RFC 7519),它定义了一种简洁的、自包含的协议格式,用于在通信双方传递 JSON 对象,传递的信息经过数字签名可以被验证和信任。JWT 可以使用 HMAC 算法或使用 RSA 的公钥/私钥对来签名,防止被篡改。

JWT 是一种规范(规则)。使用该规则可以生成包含用户信息的 Token 字符串(自包含令牌)。

JWT 由三部分组成:

image-20220129225023575
  • header:JWT 头部。声明需要使用什么算法来生成签名(密码),如 HMAC、SHA256 或 RSA
  • payload:有效负载。需要保存的用户数据
  • signature:签名哈希(防伪标志)。先对 headerpayload 经过 Base64Url 编码(非加密),然后使用 header 中指定的加密算法对编码结果进行加密,即可得到签名 signature

image-20220129225519072

https://www.bilibili.com/video/BV1ob4y1Y7Ep/?spm_id_from=333.788

JWT 结构

  1. header:JWT 头部。包括令牌的类型(即JWT)及使用的哈希加密算法(如 HMAC、SHA256 或RSA) 。例如:
1
2
3
4
{
"alg": "HS256",
"typ": "JWT"
}

将上边的内容使用 Base64Url 编码,即可得到 JWT 令牌的第一部分。

  1. payload:有效负载,内容也是一个 JSON 对象,它是存放有效信息的地方,它可以存放 JWT 提供的现成字段,比如:iss(签发者),exp(过期时间戳),sub(面向的用户)等,也可自定义字段。 此部分不建议存放敏感信息,因为此部分可以通过解码还原原始内容。例如:
1
2
3
4
5
{
"sub": "1234567890",
"name": "456",
"admin": true
}
  1. signature:签名哈希(防伪标志)。此部分用于验证 JWT,防止 JWT 内容被篡改。 这个部分使用 Base64Url 将前两部分进行编码,编码后使用点 . 连接组成字符串,最后使用 header 中声明签名算法进行签名。例如使用 HMAC 算法对前两段进行加密(需要指定密钥 secret 值,用于加签和验签):
1
2
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret)
阅读全文

【Java】HashMap 源码分析

HashMap 结构

本文参考博客:https://juejin.cn/post/6844904111817637901

HashMap 继承自 Map 接口,特点如下:

  • 存储数据是无序的(因为 hash 值是无序的)
  • 插入和查询效率很高,时间复杂度接近 O(1)
  • 线程不安全(若想要保证线程安全,可以使用 CollectionssynchronizedMap,或者 ConcurrentHashMap

HashMap 的结构为数组 + 链表 + 红黑树(JDK 1.8):

红黑树是在 JDK1.8 版本才引入的,目的是加快链表的查询效率

image-20220208162356069

从图中可以看出,HashMap 的底层是一个哈希桶数组 Node<K, V>[] table,数组内存储的是 Node 结构的数据。

数组中每一个桶(bucket)内可以存储多个 Node

  • JDK 1.7:以链表形式存储
  • JDK 1.8:如果链表很长,那查询效率便会降低,所以自 JDK 1.8 开始便引入了红黑树结构,即当某一个桶内的链表长度超过 8 的时候,链表便会转为红黑树。另外,当链表长度小于 6 的时候,会从红黑树转为链表。

HashMap 采用链地址法,即在数组的每个索引处都是一个链表结构,这样就可以有效解决 Hash 冲突(Hash 碰撞)问题。

阅读全文

【JavaWeb】Session 和 Cookie

  • 会话(Session):用户打开一个浏览器,访问了一些web资源,关闭浏览器,这个过程可以称为一个会话。
  • 有状态会话:浏览器能够保存客户端信息的会话。

保存会话

  • Cookie:客户端技术(请求,响应),服务器给客户端创建Cookie。是服务器通知客户端保存键值对的一种技术,客户端有了Cookie后,每次请求都会发送给服务器,每个Cookie的大小不能超过4kb
  • Session:服务器技术,可以保存用户的会话信息。可以把信息和数据放在session中

为什么需要保存会话?

因为 HTTP 连接是短连接,是无状态的。用户之前登陆过后再次登录时,还需要再次输入用户名和密码信息,因此为了帮用户保存这些信息,需要使用 Session 和 Cookie 技术(或 Token 技术)。

Session 原理

每个客户端(浏览器)在与服务器端产生连接后,都会在服务器端为该客户端创建一个独有的 Session 对象。Session 就是 Tomcat 服务器内存中保存的一个 Map 对象,所有 Session 对象都放到一个 SessionManager 里进行管理,不同的 Session 代表与不同的客户端进行的会话。

Session 和 Cookie 的关系:

  • 在某个客户端(浏览器)第一次访问服务器时,将创建一个 Session 对象,并保存到服务器端
  • 同时令客户端保存一个 jsessionid = sessionId 的 Cookie。其 key 值是固定的 jsessionid,value 是 sessionId。浏览器关闭前该 Cookie 将一直存在
  • Cookie 中还保存着一个重要信息:Domain(域名)。该值保存着该 Cookie 可以访问的网站域名。当访问一个网站时,浏览器会从目前存活的所有 Cookie 中选出 Domain 匹配当前网站的那些 Cookie,并在访问该网站时在请求头里带上这些 Cookie。
  • 之后 Cookie 存在期间每次访问对应 Domain 的服务器都将带上 Cookie 信息(在请求头中)
  • 浏览器关闭后,清除掉 Cookie,服务器端清除掉 Session

Cookie 是浏览器负责保存Session 是服务器负责保存。Cookie 中保存着 Session 信息,对应唯一的一个 Session。

示意图:

image-20220113161932370

Session 安全性

问题:如果黑客随意编写 Session ID,不就能登录任意用户的账号了吗?

加签验签可以解决该问题。

  • 加签:服务器在发送 Cookie 之前对这个含有 Session ID 的 Cookie 进行签名,生成一个签名 sign 一同发送给浏览器,也作为该域名下的一个 Cookie。
  • 验签:当浏览器再发送请求时,服务器会先验证该请求携带的 Cookie 中,签名 sign 能否匹配上 Session ID。如果能匹配,则认证成功;否则,认证失败,拒绝访问。

支付宝的支付服务同样有加签和验签步骤保证数据安全性。

阅读全文

【Tomcat】Tomcat

Tomcat 简介

Tomcat 是由 Apache 软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对ServletJavaServer PageJSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。Tomcat提供了一个Jasper编译器用以将JSP编译成对应的Servlet。

Servlet接口和Servlet容器这一整套规范叫作Servlet规范。Tomcat按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。

Tomcat 本质上是一个 Servlet 容器。开发人员只需要实现 Servlet 接口并注入到 Servlet 容器中,剩下的跳转响应都交给 Tomcat 实现。*

历史

Tomcat 最初由Sun公司的软件架构师 James Duncan Davidson 开发,名称为 JavaWebServer

  • 1999年 ,在 Davidson 的帮助下,该项目于1999年于 apache 软件基金会旗下的 JServ 项目合并,并发布第一个版本(3.x),即是现在的Tomcat,该版本实现了 Servlet2.2 和 JSP 1.1 规范
  • 2001年,Tomcat 发布了4.0版本,作为里程碑式的版本,Tomcat 完全重新设计了 其架构,并实现了 Servlet 2.3 和 JSP1.2规范
  • 目前 Tomcat 已经更新到 9.0.x 版本,但是目前企业中的Tomcat服务器, 主流版本还是 7.x 和 8.x 版本

常见 web 服务器软件

  • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范 servlet/jsp。开源的,免费的
阅读全文

【JavaWeb】文件上传

准备工作

apache的开源工具common-fileupload包负责完成文件上传,其依赖于common-io包

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

使用类介绍

文件上传的注意事项:

  • 为保证服务器安全,上传文件应该放在外界无法访问的目录下,比如WEB-INF目录下(该目录下的文件只能通过转发和重定向跳转
  • 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(使用uuid或时间戳)
  • 要限制上传文件的最大值
  • 可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法

使用类:

  • DiskFileItemFactory:解析ServletFileUpload对象
  • ServletFileUpload:负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象
  • FileItem:表单的每个输入项都是一个FileItem对象
阅读全文

【Java】代理模式

代理模式简介

https://segmentfault.com/a/1190000011291179

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。

代理模式UML类图

代理模式UML类图

其实很多动态代理场景,我认为也可以看作是装饰器(Decorator)模式的应用。通过代理可以让调用者与实现者之间解耦。比如进行 RPC 调用,框架内部的寻址、序列化、反序列化等,对于调用者往往是没有太大意义的,通过代理,可以提供更加友善的界面。

阅读全文

【前端】ES6

ES6

ECMAScript6.0(以下简称ES6,ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本),是JavaScript语言的下一代标准,2015年6月正式发布,从ES6开始的版本号采用年号,如ES2015,就是ES6。ES2016就是ES7。ECMAScript 是规范,JS 是规范的具体实现。

ES6 是 JavaScript 语言的下一代标准,2015年6月正式发布。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

阅读全文

【JavaWeb】JavaWeb 基础

JavaWeb

JavaWeb是指所有通过Java语言编写的,可以通过浏览器访问的程序的总称。JavaWeb是基于请求和响应开发的。

  • 请求:客户端给服务器发送数据,Request
  • 响应:服务器给客户端传回数据,Response

JavaWeb三大组件:Servlet程序、Filter过滤器、Listener监听器

HTTP

HTTP:超文本传输协议。是一个简单的请求-响应协议,通常运行在TCP之上,端口号:80。HTTPS相比HTTP更为安全。HTTP两个时代:

  • HTTP1.0:客户端与web服务器连接后,只能获得一个web资源。
  • HTTP2.0:客户端与web服务器连接后,可以获得多个web资源。

HTTP 请求

请求行

  • 请求行中的请求方式:GETPOST
  • 请求方式:GETPOSTHEADDELETEPUT
    • GET检索 && 获取。会在 URL 中显示数据内容(URL 长度有限制,视浏览器而定,例如Chrome的URL长度限制为2Mb,2048个字符),一般没有请求体。不安全,但高效。是幂等性的Content-Type 通常为 application/x-www-form-urlencoded
    • POST创建 || 更新。不会在URL中显示数据内容,而是显示在请求体中。相对安全,但不高效。请求对资源有副作用,不是幂等性的

HTTP POST 请求的内容是在请求体内的,但也不是绝对安全的。他人截获该请求后仍可以得到请求体内容。若想保证安全性,还需要使用 HTTPS 的加密方法对请求体内容进行加密。

GET请求

image-20210501214204632

中文在URL中使用百分号编码(Percent-Encoding,只是一种机制),字符的编码方式通常是UTF-8,而不是使用ASCII编码。

POST请求

image-20210501214745892

浏览器的收藏和前进跳转都是 GET 请求,因为 GET 请求会在 URL 中保存具体参数,而 POST 一般不会保存。GET 请求常用来做缓存,POST 请求一般不做缓存。

GET 请求用于缓存:

image-20220129123937818

HTTP 响应

响应状态码:

  • 101:转换协议(例如HTTP协议转换成WebSocket协议)
  • 200:请求响应成功
  • 3xx:请求与重定向(304可以使用缓存的内容)
  • 4xx:找不到资源(404 资源不存在),客户端的错误(比如输入错误的地址),访问被拒绝(403 Forbidden 权限不够)
  • 5xx:服务器内部错误(500),网关错误(502)

image-20210501215225830

URL 和 URI

URI:资源识别符;URL:比 URI 多了一个定位功能,就是用定位的方式实现的 URI。URL 是 URI 的子集

  • 在 Web 领域上,假设所有的 Html 文档都有唯一的编号,记作 html:xxxxx,xxxxx 是一串数字,即Html 文档的身份证号码,这个能唯一标识一个 Html 文档,那么这个号码就是一个 URI。
  • 而 URL 则通过描述是哪个主机上哪个路径上的文件来唯一确定一个资源,也就是定位的方式来实现的 URI。

示例:

阅读全文

【前端】AJAX

简介

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。AJAX 不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。

在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。Google Suggest能够自动帮你完成搜索单词。Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。

传统的网页(即不用AJAX技术的网页),想要更新内容或者提交一个表单,都需要重新加载整个网页。而使用AJAX技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。使用AJAX,用户可以创建接近本地桌面应用的直接、高可用、更丰富、更动态的Web用户界面。

jQuery.ajax

  • AJAX的核心是XMLHttpRequest对象(XHR)。XHR为向服务器发送请求和解析服务器响应提供了接口。能够以异步方式从服务器获取新数据。
  • jQuery 提供多个与 AJAX 有关的方法。
  • 通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本、HTML、XML 或 JSON – 同时您能够把这些外部数据直接载入网页的被选元素中。
  • jQuery AJAX本质就是 XMLHttpRequest,对他进行了封装,方便调用!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
jQuery.ajax(...)
部分参数:
url:请求地址
type:请求方式,GET、POST(1.9.0之后用method)
headers:请求头
data:要发送的数据
contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
async:是否异步
timeout:设置请求超时时间(毫秒)
beforeSend:发送请求前执行的函数(全局)
complete:完成之后执行的回调函数(全局)
success:成功之后执行的回调函数(全局)
error:失败之后执行的回调函数(全局)
accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
dataType:将服务器端返回的数据转换成指定类型
"xml": 将服务器端返回的内容转换成xml格式
"text": 将服务器端返回的内容转换成普通文本格式
"html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
"script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
"json": 将服务器端返回的内容转换成相应的JavaScript对象
"jsonp": JSONP 格式使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数

ajax常用参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$.ajax({
url: "http://www.hzhuti.com", //请求的url地址
dataType: "json", //返回格式为json
async: true, //请求是否异步,默认为异步,这也是ajax重要特性
data: { "id": "value" }, //参数值
type: "GET", //请求方式
beforeSend: function() {
//请求前的处理
},
success: function(req) {
//请求成功时处理
},
complete: function() {
//请求完成的处理
},
error: function() {
//请求出错处理
}
});
阅读全文