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