《深入分析Java Web技术内幕》读书笔记
深入分析Java Web技术内幕
1深入Web请求
一个HTTP连接本质上是建立一个Socket连接,所以可以使用HTTPClient模拟
HTTP协议中最重要的是Header,控制着数据传输,控制着浏览器的渲染和服务器的执行逻辑。
Cache-control/Pragma:
用于指定所有缓存机制在整个请求中必须服从的指令。如果知道该页面是否是缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。
Cache-control:no-cache与Pragma:no-cache作用一样
Expires:过期时间。浏览器发出请求前,先检查是否过期,过期了就重新请求数据。
Last-modify:服务器资源的最后修改时间。配合304Code,304即目前页面是最新的,不用请求。
HOST配置:
与Window对应的,在Linux系统中,文件是/etc/named.conf
HOST文件在系统域名解析时用。域名解析过程(浏览器缓存、OS Host文件、域名服务器)
Win/Linux查看域名解析结果:nslookup
刷新DNS缓存:Win:ipconfig/flushdns
Linux:/etc/init.d/nscd restart
Java JVM中也会缓存DNS的解析结果:
在InetAddress类中完成。有两种缓存策略:正确解析结果缓存,失败解析结果缓存。这2个缓存时间配置决定,位于%JAVA_HOME%/lib/security/java. Security文件。配置项是networkaddress.cache.tll和networkaddress.cache.nagetive.tll,默认值是-1和10秒。
要修改这两个值,可以直接改文件,也可以再启动时加-Dsun.net.inetaddr.tll=XXX修改默认值。或通过INetAddress类修改。
域名解析记录形式
A记录:
A代表Address,用来指定域名对应的IP。A记录可以将多个域名解析到一个IP,但不能将一个域名解析到多个IP。
MX记录:
表示Email Exchange。将域名下的邮件服务器指向自己的Mail Server。
CNAME记录:即别名解析。为一个域名设置一个或多个别名。
NS记录:为某个域名指定DNS解析服务器。
TXT记录:为某个主机名或域名设置说明。
常用的负载均衡架构设计:链路负载均衡、集群负载均衡、操作系统负载均衡。
链路负载均衡:通过DNS解析到不同IP,用户请求根据IP访问不同服务器;(优)请求直接访问目标服务器,无需经过代理,快。(缺)某个服务器挂掉,很难及时更新域名解析结构。
集群负载均衡:分为软件负载均衡(成本低,多次代理,会增加延时)、硬件负载均衡(使用一台专门的硬件设备转发请求,性能好但很贵)。
操作系统负载均衡:利用OS中的软中断或硬件中断达到负载均衡。
2Java IO机制
Java IO类在io下,80多个类。分为四组:
字节操作:InputStream OutputStream
字符操作:Writer Reader
磁盘操作:File
网络操作:Socket
访问文件的方式
标准访问方式:当应用程序调用read接口时,OS检查内核的高速缓存中有没有需要的数据,如果已经缓存了,就直接从缓存中取出。如果没有,从磁盘中读取,并缓存到OS的缓存中。
直接IO方式:直接从磁盘读取,减少数据的缓存复制。
同步访问方式:数据读写都是同步操作,只有数据写入磁盘才返回成功标记。(性能差)
异步访问方式:线程发出数据请求后,继续做其他事情,而非阻塞等待。数据返回后再处理。(高效)
Java序列化:将一个对象转化为二进制的字节数组。更好的多语言间的序列化工具,如Google Proto。
Linux磁盘IO情况命令:iostat
查看可使用的端口范围:/proc/sys/net/ipv4/ip_local_port_range
网络IO优化
减少网络交互次数(设置缓存、合并请求)、减少网络传输数据量的大小(数据压缩、简单协议—只读头部内容)、尽量减少编码(网络IO以字节传输)。
同步异步、阻塞非阻塞
根据交互场景设计合适的交互方式,主要有同步异步、阻塞非阻塞。
同步异步的比喻:打电话和短信
阻塞和非阻塞是从CPU角度说的。阻塞就是CPU停下来等待一个慢任务完成后,才能做其他的事情;非阻塞就是慢任务进行时CPU进行其他事情,等慢任务完成,CPU再继续做后续工作。非阻塞表面提高了CPU利用率,但也带来线程切换。
其组合共有四种:
同步阻塞:最简单最常用的,IO性能差,CPU大部分时间是空闲状态;
同步非阻塞:提升IO性能的常用手段,在网络IO长连接同时传输数据不多时使用;
异步阻塞:分布式数据库常用。一个写操作,写几个机器。提升网络IO效率。尤其是同时写多分数据。
异步非阻塞:少数非常复杂的情况下使用。如集群消息同步,如cassandra。适用于同时写多份相同数据到不同机器,数据量不大但很频繁。
设计模式之适配器模式
功能:将一个类的接口变成客户端所能接收的另一种接口,从而使两个不匹配、无法工作的2个类一起工作。
Java IO类库中应用该模式的类:InputstreamReader和OutputStreamWriter,StringReader,ByteArrayInputStream。
设计模式之装饰器模式
让类重新装饰一下,更漂亮或功能更强大。而类原来的使用者不会感受到装饰前后的变化。
Java IO示例:FilteriorInputStream
装饰器模式和适配器模式的异同:
都有一个别名包装模式,透明的作用看起来都是包装一个类或对象的作用,但目的不一样。
适配器模式的意义是将一个接口变成另一个接口,通过改变接口实现复用的目的;
装饰器模式不是要改变被装饰对象的接口,而且保持原接口,但增强接口的功能。
3中文编码问题
为什么要编码
计算机中存储信息的最小单位是byte字节,8个bit,所以能表示的字符有0-255;
人类的符号太多,无法用一个字节表示。
所以必须要有一个新的数据结构char,从char到byte要编码
各种编码
汉字编码:GB2312,GBK,UTF8,UTF16
几种编码格式比较:
GB2312<GBK:GBK范围大,能表示所有汉字
UTF16是Java内存编码方式,但不适合网络传输
UTF8最理想
URL编码
URL组成:
http:// localhost :8080 /examples /servlets/ info=
schema domain port contextPath servletPath path info
?a=aaa
queryString
同一个汉字在path info和queryString的编码是不一样的,比如前者可能是UTF8编码后者可能是GBK编码。不同浏览器对path Info的编码可能不一样。
浏览器URL编码规则是将非ASCII字符按照某种编码格式编码成每个16进制表示的字节+%
在Tomcat中对URL中URI部分编码的设置是在connector的URIEncoding进行的
不同的JS框架对URL编码处理不同
JS中常用的编码函数escape():将ASCII、数字、字母、标点符号以外的字符均转化为Unicode。并在编码值前加%u。解码unsecape().
EncodeURI():将整个URL进行UTF8编码,每个编码值前加%
解码decodeURI()。
EncodeURIComponent():除数字、字母不编码,其他均编码。解码decodeURIComponent()、
4Javac编译原理
Javac编译器的工作:将Java语言规范转化为JVM语言规范。即将Java源代码的语言转化成当前这台机器能够识别的机器语言。
常见编译器的工作步骤
1读取源代码,一个个字节读入,找出预发关键词--词法分析,找出规范的Token流;
2对Token流进行语法分析,检查这些关键词组合是不是符合Java规范,形成抽象语法树;
3语义分析:复杂语法转化简单语法;形成注解过的抽象语法树;
4通过字节码生成器生成字节码;
5深入Class文件结构
6深入分析ClassLoader工作机制
ClassLoader的作用:
1class文件加载到JVM
2审查每个类由谁加载(父优先的等级加载)
3class字节码重新解析成JVM统一要求的格式
7JVM体系结构和工作方式
JVM基本结构:类加载器、执行引擎(解析字节码,得到执行结果)、内存区、本地方法调用
高级语言之所以屏蔽硬件差异是因为中间有一层编译,与硬件耦合的工作交给了编译器
JVM执行字节码基于栈的结构理由:要设计成与平台无关、为了JVM更好的优化代码、指令的紧凑性
8JVM内存管理
Java中使用内存的组件:Java堆、线程、类和类加载器、NIO、JNI
Java内存分配主要有堆栈两种形式
9Servlet工作原理解析
url-pattern:精确匹配、路径匹配、后缀匹配
10深入理解Session和Cookie
作用都是为了保持访问用户和服务器的交互状态
每次addCookie都会增加一个Header,但返回时会降Header汇总成一个
Spring的三大核心组件:Core、Context、Bean
Java采用的是big endian字节序
zookeeper的Java API ZKClient
memcache客户端和服务端通过构建在TCP之上的memcache协议通信。协议支持两种数据传输:文本行(客户端的命令和服务端的响应)和非结构化数据(客户端和服务端数据传递)。
memcache不是分布式系统,分布式功能由客户端保证,如根据Key Hash%机器
潜在问题:某台机器负载可能很高--》一致性Hash解决
分布式Session可以用memcache,缺点:重启后会话数据会丢失,需要重新建立
Tomcat可以使用memcached-session-manager工具(配置在config.xml)结合memcache实现分布式session
Hbase伸缩能力好,更适合海量数据存储和处理,并发写入能力好;但查询维度有限,不支持group by,order by ,join等复杂操作;
Redis读写吞吐能力好,支持的并发数高,能提供丰富的数据结构支持。
互联网安全架构
常见的web攻击手段和防御方法,如XSS、CRSF、SQL注入、DDOS攻击等;
常见的安全算法:如数字摘要、对称加密、非对称加密、数字签名、数字证书;
如何采用摘要认证方式防止信息篡改、通过数字签名来验证通信双方的合法性、通过HTTPS协议保障通信过程中数据不被第三方监听和截获;
在开放平台体系下,OAuth协议如何保障ISV对数据的访问是经过授权的合法行为。
XSS(跨站脚本攻击:在网页中嵌入恶意代码)
防范:(出现是因为用户数据变成了代码。)对用户输入的数据进行HTML转义处理。
CRSF(跨站请求伪造)
和XSS区别:XSS利用站内信任的用户,CRSF伪造来自受信任的用户请求来利用受信任的网站--盗用用户身份攻击网站
防御:将cookie设置为HttpOnly、增加Token(Token服务端校验)、通过refer识别
SQL注入:将SQL伪装成HTTP参数,传到服务端,欺骗服务器,执行恶意命令
防范:使用预编译语句(预编译使用参数占位符替代需要动态传入发参数,使语句的语义结构无法被改变)、使用ORM框架:iBATIS、herbiNate,避免密码明文存放。
常用的安全算法
数字摘要:亦即消息摘要,唯一对应的消息或文本的固定长度值。Hash计算产生,如MD5 128位、SHA 160位、十六进制编码、Base64编码。
对称加密算法:DES、AES。
非对称加密算法:RSA。
数字签名:非对称加密算法+数字摘要。
数字证书:含用户认证信息。
《深入分析Java Web技术内幕》读书笔记相关推荐
- 读书笔记 | 墨菲定律
1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...
- 读书笔记 | 墨菲定律(一)
1. 有些事,你现在不做,永远也不会去做. 2. 能轻易实现的梦想都不叫梦想. 3.所有的事都会比你预计的时间长.(做事要有耐心,要经得起前期的枯燥.) 4. 当我们的才华还撑不起梦想时,更要耐下心来 ...
- 洛克菲勒的38封信pdf下载_《洛克菲勒写给孩子的38封信》读书笔记
<洛克菲勒写给孩子的38封信>读书笔记 洛克菲勒写给孩子的38封信 第1封信:起点不决定终点 人人生而平等,但这种平等是权利与法律意义上的平等,与经济和文化优势无关 第2封信:运气靠策划 ...
- 股神大家了解多少?深度剖析股神巴菲特
股神巴菲特是金融界里的传奇,大家是否都对股神巴菲特感兴趣呢?大家对股神了解多少?小编最近在QR社区发现了<阿尔法狗与巴菲特>,里面记载了许多股神巴菲特的人生经历,今天小编简单说一说关于股神 ...
- 2014巴菲特股东大会及巴菲特创业分享
沃伦·巴菲特,这位传奇人物.在美国,巴菲特被称为"先知".在中国,他更多的被喻为"股神",巴菲特在11岁时第一次购买股票以来,白手起家缔造了一个千亿规模的 ...
- 《成为沃伦·巴菲特》笔记与感想
本文首发于微信公众帐号: 一界码农(The_hard_the_luckier) 无需授权即可转载: 甚至无需保留以上版权声明-- 沃伦·巴菲特传记的纪录片 http://www.bilibili.co ...
- 读书笔记002:托尼.巴赞之快速阅读
读书笔记002:托尼.巴赞之快速阅读 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<快速阅读>之后,我们就可以可以快速提高阅读速度,保持并改善理解嗯嗯管理,通过增进了解眼睛和大脑功能 ...
- 读书笔记001:托尼.巴赞之开动大脑
读书笔记001:托尼.巴赞之开动大脑 托尼.巴赞是放射性思维与思维导图的提倡者.读完他的<开动大脑>之后,我们就可以对我们的大脑有更多的了解:大脑可以进行比我们预期多得多的工作:我们可以最 ...
- 读书笔记003:托尼.巴赞之思维导图
读书笔记003:托尼.巴赞之思维导图 托尼.巴赞的<思维导图>一书,详细的介绍了思维发展的新概念--放射性思维:如何利用思维导图实施你的放射性思维,实现你的创造性思维,从而给出一种深刻的智 ...
- 产品读书《滚雪球:巴菲特和他的财富人生》
作者简介 艾丽斯.施罗德,曾经担任世界知名投行摩根士丹利的董事总经理,因为撰写研究报告与巴菲特相识.业务上的往来使得施罗德有更多的机会与巴菲特亲密接触,她不仅是巴菲特别的忘年交,她也是第一个向巴菲特建 ...
最新文章
- java 数据结构源码--Trie树
- linux raid和mdadm,linux的raid和mdadm
- Web安全CSRF攻击与防御
- 【转】extern “C“和__declspec(dllexport)以及__declspec(dllimport) 和def的简单解析
- 关于IOS内存机制的较深入分析
- NOI2011 阿狸的打字机题解
- Web后端学习笔记 Flask(10)CSRF攻击原理
- 大数据平台系统设计包括哪些
- 【哈工大SCIR Lab】Attention!注意力机制可解释吗?
- Python collections 模块中的 deque(队列)
- 树莓派 - 蓝牙 (1) 试试Beacon
- 不存在有效_文水2单位存在安全隐患!
- js页面刷新或关闭时弹框
- Echarts图表移动端手机横屏展示
- 三国演义人物关系思维导图模板分享
- 西瓜书 第九章 聚类算法
- 唐老师讲运算放大器(第五讲)——运放的应用
- Beyond compare4 激活和秘钥
- Go语言管道与高并发实战
- 【第二十一讲】参数解析器
热门文章
- python怎么利用gpu加速_python怎么利用gpu加速
- php http请求 微信,微信小程序封装http请求类的代码实例
- Elastic-jobQuartz定时任务
- string类型输入一行字符串,带空格
- SpringBoot系列(9):SpringBoot配置文件详解
- cocoaPods:公有库私有库
- Vuex之store仓库计算属性Getter
- systemd(CentOS7)启动zookeeper
- ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
- CocoaPods管理第三方,从安装到使用