JavaWeb涉及知识点思维导图
2021-08-01 17:51:19 0 举报
AI智能生成
Javaweb全网最全思维导图
作者其他创作
大纲/内容
可认为一个变量,形如name=value
cookie:服务器给每个客户端贴上标签
HTTP是无状态协议,服务器无记忆,每刷新一次网页,就要重新输入一次账号密码进行登录
cookie
一个cookie存储这样一个变量sessionID=xxxx,仅仅把这一个cookie传给服务器,然后服务器通过这个ID找到对应的session,这个session是一个数据结构,里面存储着该用户的购物车等详细信息,服务器可以通过这些信息返回该用户的定制化网页,有效解决了追踪用户的问题
可以认为是一种数据结构,多数情况是映射(键值对)存储在服务器上
session
这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。
服务器能够解析重写后的URL获取Session的id
将该用户Session的id信息重写到URL地址中
URL地址重写
JavaWeb规范支持通过配置的方式禁用Cookie。
既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。
客户端不支持cookie的解决方案
cookie数据存放在客户的浏览器上,session数据放在服务器上
cookie可以加密
cookie不安全,session更安全些
cookie保存数据量不超过4k;session存储数据结构,消耗服务器资源,可以设置过期时间清除session
cookie可以长期有效(设置过期时间),session在关闭窗口时就会消失
面试问题:说说cookie和session的区别
cookie和session
HTTP是无状态的一种协议
HTTP 协议中数据
报文
客户端和服务器之间通信发送数据,遵守的规则
HTTP 协议
双方,或多方,相互约定好,都需要遵守的规则
协议
什么是 HTTP 协议
带宽
超过浏览器最大连接数限制,后续请求就会被阻塞
浏览器对于同一个域名,同时只能有 4 个连接
DNS将域名解析为 IP ,利用DNS缓存结果来减少时间
浏览器需要知道目标服务器的 IP 才能建立连接
DNS 查询(DNS Lookup)
在高延迟的场景下影响较明显
三次握手
对文件类大请求影响较大
慢启动
但连接无法复用会导致每次请求都经历三次握手和慢启动
HTTP 基于 TCP 协议,浏览器在第三次握手时才捎带 HTTP 请求报文,真正建立连接
建立连接(Initial connection)
延迟
HTTP的基本优化
服务器整个对象传送
客户端只需要某对象一部分
浪费带宽
不支持断点续传
HTTP1.0
返回码206(Partial Content)
允许请求部分资源
请求头引入range头域
来充分利用带宽、连接
方便开发者自由选择
HTTP1.1
带宽优化、网络连接的使用
请求消息中URL没有传递主机名(hostname)
服务器绑定唯一IP地址
共享一个IP地址
存在多个虚拟主机(Multi-homed Web Servers)
一台物理服务器
请求消息、响应消息:支持Host头域,没有Host头域,报告错误(400 Bad Request)
Host头处理
更多可供选择的缓存头来控制缓存策略
更多的缓存控制策略
缓存处理
每次请求,创建连接
一个TCP连接,传送多个HTTP请求+响应,减少建立、关闭连接的消耗和延迟
支持长连接(PersistentConnection)、请求流水线(Pipelining)处理
HTTP 1.1
长连接
HTTP1.0和HTTP1.1的区别
健壮性欠佳
解析基于文本
HTTP1.x
健壮、方便
基于二进制
HTTP2.0
二进制格式(Binary Format)
接收方根据id将request分发不同服务器请求
一个request一个id
一个连接多个request
连接共享
多路复用(MultiPlexing)
减少传输header大小
encode
避免重复header传输
header fields
通信双方chache
header压缩
省去客户端重复请求、建立连接
客户端需要的资源随index.html发送到客户端
服务端推送(server push)
HTTP2.0和HTTP1.X相比的新特性
HTTP/2 主要的问题在于:多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。一旦发生了丢包现象,就会触发 TCP 的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。
QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。
TL3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack。
HTTPS 要建立一个连接,要花费 6 次交互,先是建立三次握手,然后是 TLS/1.3 的三次握手。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数。所以, QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议。
UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输
UDP
UDP 发生是不管顺序,也不管丢包的,所以不会出现 HTTP/1.1 的队头阻塞 和 HTTP/2 的一个丢包全部重传问题。
HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP
HTTP/2 有哪些缺陷?HTTP/3 做了哪些优化?
超链接
http/1.0 http/1.1 http/2之间的区别
默认端口80
URL“http://”
HTTP
默认端口443
URL由“https://”
HTTPS
端口
混合加密
信息加密
内容可能会被窃听。比如,账号信息容易泄漏,那你号没了
窃听风险
摘要算法生成独一无二指纹用于校验数据完整性
校验机制
无法证明报文的完整性,所以有可能已遭篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。
篡改风险
将服务器公钥放入到数字证书中,解决了冒充的风险
身份证书
不验证通信方的身份,因此有可能遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。
冒充风险
传输内容明文
运行在TCP之上
TLS传输层安全性协议Transport Layer Security
SSL(Secure Sockets Layer 安全套接字协议)
更耗服务器资源
传输内容加密
运行在SSL/TLS之上
安全性--资源消耗
HTTPS在TCP三次握手之后,还需要进行SSL/TLS的握手过程,才能进行加密报文传输
建立连接
http和https的区别
客户端和服务端约定使用相同的密钥(加密传输信息,防止信息被劫持和篡改)
对称加密
私钥加密,任意的公钥可以解密
公钥加密,只有私钥能解密
服务器拥有私钥,所有客户端都可以获得公钥
分为公钥和私钥
非对称加密
客户端向服务器发送请求,服务器回复CA数字签名和公钥,客户端验证证书(防止中间公钥被截取、篡改,解决网站被冒充的问题)公钥加密一个随机对称密钥,对称密钥加密URL信息,传给服务器。服务器用自己的私钥解密,使用相应的对称密码进行解密。之后信息传输使用对应的对称密钥
网站如何通过加密和用户安全通信
https安全加密如何防止攻击
需要更好的CPU
HTTPS协议是计算密集型,⽽不是I/O密集型
硬件优化
软件升级
软件优化
⽀持「FalseStart」,“抢跑”的意思,客户端可以在TLS协议的第3次握⼿后,第4次握⼿前,发送加密的应⽤数据,以此将TLS握⼿的消息往返由2RTT减少到1RTT,⽽且安全性也⾼,具备前向安全性。
尽量选用ECDHE(椭圆曲线elliptic curve,Diffie-Hellman,ephemeral临时性的)
TLS1.2升级成TLS1.3,TLS1.3⼤幅度简化了握⼿的步骤,完成TLS握⼿只要1RTT,⽽且安全性更⾼。
TLS升级
协议优化
对于服务器的证书应该选择椭圆曲线(ECDSA)证书,⽽不是RSA证书,因为在相同安全强度下,ECC密钥⻓度⽐RSA短的多。
证书传输优化
证书验证优化
证书优化
会话复⽤
优化https
除了get和post还有delete put head trace connect options
get和post 请求都是HTTP请求方法,而HTTP又是基于TCP/IP 的关于数据如何在万维网中通信的协议
get\tpost 都是TCP链接。 HTTP将其分开方便管理
Get请求信息在URL之后,POST请求信息放在request body中
请求信息位置
Post请求方式相对get的url可以传输更多数据
请求信息长度
幂等:同一个URL的多次请求返回同样的结果
get信息获取是安全幂等的,(安全针对未对数据库进行修改,不影响资源状态。\t\t 但get请求一次会有缓存,针对用户名密码不安全)
Post请求会修改数据库数据,参数不会保存
操作上
get请求:把http header和data一并发送,服务器响应返回数据
Post请求:浏览器先发送header,服务器响应100,浏览器再发送data,服务器\t 响应返回数据
速度上
http中 get和post区别
请求的资源路径[+?+请求参数]
key : value 组成 不同的键值对,表示不同的含义
请求头
form 标签 method=get
a 标签
link 标签引入 css
Script 标签引入 js 文件
img 标签引入图片
iframe 引入 html 页面
在浏览器地址栏中输入地址后敲回车
GET 请求有哪些
GET 请求
form 标签 method=post
POST 请求有哪些
客户端发送请求,⽤来指定服务器的域名
Host
客户端可以接收的数据类型
Accept
告诉服务器请求连接如何处理
告知服务器回传数据不要马上关闭,保持一段时间连接
Keep-Alive
Connection
回传数据长度
Content-Length
Content-Type
Content-Encoding
HTTP常用字段有哪些?
POST 请求
请求
客户端给服务器发送数据叫请求
请求的 HTTP 协议格式
接收的请求正在处理
信息性状态码
1**
表示请求成功(一般用于get与post请求)
200
成功状态码
2**
请求的资源已被永久移到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
永久移动
301
与301类似。但资源只是临时被移动。客户端应继续使用原有URI
临时移动
302
重定向,需要进一步的操作以完成请求
3**
客户端错误状态码,服务器无法处理请求
例如:需要Integer类型而输入String
例如:@RequestParam的required设置为true,但请求未给出参数
客户端请求语法错误,服务器无法理解
400
没有token令牌
Unauthorized
401
表示请求服务器已收到,但是想要数据不存在(请求地址错误)
404
客户端请求中的方法被禁止
405
例如:@ResponseBody将json数据响应给客户端时,没有json的jar包支持
服务器响应的数据客户端无法接受
406
4**
服务器错误状态码,服务器处理请求出错
例如:12/0
表示服务器已经收到请求,但是服务器内部错误(代码错误)
500
5**
HTTP状态码(响应码)状态码描述了请求过程中发生的情况
回传给客户端的数据
响应体
分支主题
服务器给客户端回传数据叫响应
响应的 HTTP 协议格式
Servlet 程序
过滤响应
拦截请求
JavaEE规范,接口
权限检查
日志操作
事务管理
场景
web工程下的admin目录下所有资源作为目标资源
用户登录信息保存在Session域
用户登录后才允许访问
判断session中是否包含用户登录信息
判断用户是否登录
public class AdminFilter implements Filter
编写类实现Filter接口
doFilter 方法,专门用于拦截请求、可以做权限检查
HttpSession session = httpServletRequest.getSession();
拦截
user为空
允许访问admin资源
user存在
Object user = session.getAttribute("user");
实现过滤方法doFilter()
<!--filter-mapping 配置 Filter 过滤器的拦截路径--> <filter-mapping> <!--filter-name 表示当前的拦截路径给哪个 filter 使用--> <filter-name>AdminFilter</filter-name> <!--url-pattern 配置拦截路径 / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录 /admin/* 表示请求地址为:http://ip:port/工程路径/admin/* --> <url-pattern>/admin/*</url-pattern> </filter-mapping>
<filter> <!--给 filter 起一个别名--> <filter-name>AdminFilter</filter-name> <!--配置 filter 的全类名--><filter-class>com.xinzhang.filter.AdminFilter</filter-class></filter>
web.xml配置Filter拦截路径
Filter过滤器使用步骤
Filter工作流程图
所有filter和目标资源默认执行在同一个线程
多个Filter共同执行时,都会使用同一个Request对象
多个Filter过滤器执行特点
执行下一个Filter过滤器
执行目标资源
没有下一个
web.xml配置顺序
执行顺序
FilterChain.doFilter()方法作用
FilterChain 过滤器链
Filter 过滤器
反馈客户(程序)做相应处理
通过回调函数
监听事物变化
ServletContext对象在web工程启动时创建,web工程停止时销毁
监听到创建和销毁,调用ServletContextListener方法反馈
监听ServletContext对象创建和销毁
ServletContextListener
Listener 监听器
JavaWeb 三大组件
并将HttpServletResponse响应数据给客户端
在doGet()/doPost()中做相应处理
调用doGet()
属性为get
调用doPost()
属性为post
form标签method
什么情况下调用doGet()和doPost()
接收用户(客户端)请求HTTPServletRequest
多线程并发读写导致数据不同步
会造成线程等待
synchronized
name属性分别定义在doGet()和doPost()方法内
只读属性定义为final类型
只是并发读取不写入
解决方案
Servlet不是线程安全的
一个Servlet可设置多个URL访问
一个Servlet类只有一个实例
Servlet
编写一个类去实现 Servlet 接口
service 方法专门用来处理请求和响应
实现 service 方法,处理请求,并响应数据
到 web.xml 中去配置 servlet 程序的访问地址
手动实现 Servlet 程序,implements Servlet
编写一个类去继承 HttpServlet 类
根据业务需要重写 doGet 或 doPost 方法
到 web.xml 中的配置 Servlet 程序的访问地址
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
Servlet 程序的配置信息类
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用
Servlet 程序默认第一次访问时创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象
ServletConfig 类
可以获取 Servlet 程序的别名 servlet-name 的值
获取初始化参数 init-param
获取 ServletContext 对象
ServletConfig 类的三大作用
ServletContext 是一个接口,表示 Servlet 上下文对象
一个 web 工程,只有一个 ServletContext 对象实例
remove()
get()
put()
Map
removeAttribute()
getAttribute()
setAttribute()
域对象
存、取、删除数据
域对象,是可以像 Map 一样存取数据的对象
域指存取数据的操作范围,整个 web 工程
ServletContext 对象是一个域对象
ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
获取 web.xml 中配置的上下文参数 context-param
获取当前的工程路径,格式: /工程路径
获取工程部署后在服务器硬盘上的绝对路径
像 Map 一样存取数据
ServletContext 类的四个作用
ServletContext 类
Servlet 类的继承体系
执行 Servlet 构造器方法
在第一次访问时创建 Servlet (Filter)程序调用
第一、二步
执行 init 初始化方法
每次访问(刷新网页)(拦截请求)都会调用
第三步
执行 service (doFilter过滤)方法
在 web 工程停止时调用
第四步
执行 destroy 销毁方法
Servlet (Filter)的生命周期
通过HttpServletRequest对象,获取所有请求信息
传递到service方法(doGet、doPost)供我们使用
封装到Request对象
把请求中HTTP协议解析
请求进入Tomcat服务器
作用
URI:统一资源标识符(Uniform Resource Identifier)
获取请求的资源路径(web.xml Servlet-mapping:/api)
request.getRequestURI()
URL:统一资源定位系统(uniform resource locator)
http://localhost:8080/api
获取请求的统一资源定位符(绝对路径)
request.getRequestURL()
get
input text
获取请求参数GET、POST
request.getParameter(String string)
Object key1 = request.getAttribute("key1");
获取对象容器中数据
request.getAttribute()
request.getAttribute()和 request.getParameter()有何区别
checkbox
获取请求的多个参数
request.getParameterValues(String s)
在doGet方法中
extends HTTPServlet
常用方法
浏览器地址栏没有变化
两次是同一请求
共享Request域中数据
服务器行为
转发
可以转发到WEB-INF目录下
不可以访问工程外资源
请求转发
HttpServletRequest 类
设置返回给客户端的信息
传递给Servlet程序使用
创建Response对象
浏览器地址栏发生变化
两次请求
request.getAttribute("key1")
不共享Request域中数据
不能访问WEB-INF下资源
response.sendRedirect("http://localhost:8080/response2");
客户端行为
重定向
可以访问工程外资源
请求重定向
HttpServletResponse 类
Servlet中成员变量、局部变量线程安全案例分析
替代servlet回传html页面数据
java的服务页面
java server pages
Servlet:控制器(controller)
JSP:视图(view)
MVC架构模式中
封装客户端请求,GET、POST请求参数
request
封装服务器对客户端响应
response
jsp的上下文对象
pageContext
会话对象
ServletContext对象
application
servletConfig对象
config
jsp输出流对象
out
指向当前jsp对象
page
异常对象
exception
9个内置对象
当前 jsp 页面范围内有效
PageContextImpl 类
一次请求内有效
一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
HttpSession 类
整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)
jsp 四大域对象
JSP
JavaWeb
收藏
收藏
0 条评论
回复 删除
下一页