深入分析Java Web ~企业内部技术总结[一]
{
我一直很欣赏两句话:
做自己喜欢做的事,那就够忙一辈子了~~
把时髦的技术挂在嘴边,还不如把过时的技术记在心里~~
这两句话也时常勉励自己 ,好了不多说了,做些总结吧~
}
本月主要文章主要完成一个体系的深入Java Web内部技术问题的分享[挑重点]
第一章 {深入Web请求过程}
1.1 如何发送一个请求
如何发送一个请求
如何发起一个HTTP请求? 这个问题似乎很简单又复杂,简单是指当你在浏览器里输入一个我URL时,回车后这个HTTP协议就发起了,
很快你就可一看到这个请求的返回结果,复杂是指不借助浏览器发送请求,这里的“不借助”有两层含义,一是指能不能自己组装一个符合
HTTP协议的数据包,二是处理浏览器还有哪些方式能简单发起一个HTTP请求
如何发起一个HTTP请求和如何建立一个Socket连接区别不大,只不过outputStream.write写的二进制字符节数据格式符合HTTP协议,
浏览器在建立Socket连接之前,必须根据地址里输入URL的域名DNS解析出IP地址,在根据这个IP地址和默认端口80端口与远程服务器建立
Socket连接,然后浏览器根据URL组装一个get的http请求,在outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据
最后断开这个连接
当然,不同的浏览器在如何使用这个已经建立好的连接,以及根据什么规则来管理连接,有各种不同方式来实现,一句话,发送一个HTTP协议就是
建立一个Socket通信过程
既然发起一个HTTP连接本质就是建立一个Socket连接,那么我们完全可以模拟浏览器来发送HTTP请求,这样很好实现,也好多方法来实现,如HttpClient
就是一个开源的通过程序实现处理HTTP请求的工具包,当然如果你对HTTP协议的数据结构非常熟悉
你完全可以自己实现另外一个HttpClient ,甚至可以自己写一个简单的浏览器
下面是一个基本的HttpClicent的调用示例:
HttpClient httpClient = createHttpClient();
PostMethod postMethod;
String domainName = Switcher.domain;
postMethod = new PostMethod(domainName);
postMethod.addRequestHeader("Content-Type", "application/x-www-form-
urlencoded; charset=GBK");
for (FilterData filterData : filterDatas) {
postMethod.addParameter("ip", filterData.ip);
postMethod.addParameter("count", String.valueOf(filterData.count));
}
try {
httpClient.executeMethod(postMethod);
postMethod.getResponseBodyAsString();
} catch (Exception e) {
logger.error(e);
}
处理Java中使用非常普遍的HttpClient还有很多类似的工具,如Linux中Curl命令,通过Curl+URL就可以简单发起一个Http请求,非常方便
如:
CURL "http://item.taobao.com/item.htm?id=1264" 可以返回这个页面的HTML数据

可以查看这次访问的HTTP协议信息

[junshan@v101055.sqa.cm4 admin]$ curl -I "http://switch.taobao.com:9999/ repository.htm" -H "Cookie:cna=sd0/BjeZulwCAfIdAHkzZZqC; _t_track=121.0.29. 242.1320938379988839;" HTTP/1.1 200 OK Date: Sat, 25 Feb 2012 08:41:20 GMT Server: Apache Last-Modified: Thu, 01 Jan 1970 00:00:00 GMT Vary: Accept-Encoding Content-Type: text/html;charset=GBK
1.2 HTTP协议解析
B/S网络架构的核心是HTTP协议对一个从事互联网工作的程序员来说非常重要,也许你已经非常熟悉HTTP协议,这里除了介绍HTTP协议的基本知识,还有侧重介绍使用中的一些心得
要理解HTTP协议,最重要的就是熟悉HTTP协议中HTTPHeader,HTTPHeader控制着互联网成千上网的用户数据的传输!他控制这用户浏览器的渲染行为和服务器的只想逻辑
如:
当服务器没有用户请求时就会返回一个404状态码,告诉浏览器没有要求请求的数据,通常浏览器就会展示一个非常不愿意的该页面不存在的错误信息!
常见HTTP请求头
| 请求头 | 说明 |
| Accept-Charset | 用于指定客户端接收的字符集 |
| Accept-Encoding | 用于指定可接受的内容编码,如:Accept-Encoding:gzip.defalte |
| Accept-Language | 用于指定一种语言,如:Accept-Language:zh-ch |
| Host | 用于指定被请求资源的Internet主机和端口号 |
| User-Agent | 客户端将它的操作系统,浏览器和其他属性告诉服务器 |
| Comnnection | 当前连接是否保持。如:Connection:Keep-Alive |
常见HTTP 相应头
| 请求头 | 说明 |
| Server | 使用的服务器名称。如:Server.Apache/1.3.6(Unix) |
| Content-Type | 用来指说明发送给接收者的实体正文的媒体类型 Content-Type:text/html;charset=GBK |
| Content-Encoding | 与请求报头Accept-Encoding对应,告诉浏览器服务端采用什么压缩编码 |
| Content-Language | 描述资源所用的自然语言,与Accept-Languange对应 |
| Content-Length | 指明实体正文长度,用以字节方式存储的十进制来表示 |
| keep-Alive | 保持连接的时间如: Keep-Alive: timeout=5, max=120 |
常见HTTP状态码
| 状态码 | 说明 |
| 200 | 客户端请求成功 |
| 302 | 临时跳转,跳转的地址通过Location指定 |
| 400 | 客户请求有语法错误,不能被服务器识别 |
| 403 | 服务器收到请求,但是拒绝提供服务 |
| 404 | 请求请求资源不存在 |
| 500 | 服务器发生不可预期的错误 |
要看一个HTTP请求的请求头和响应头,可以通过很对浏览器插件看,在FireFox中有FireBug和HttpFox,Chrome自带的开发工具也可以看到每个请求的请求头信息
(可用F12快捷键打开),IE自带的调试工具也有类似的功能
FireFox下~~

Chrome下~~

Chrome 下也有类似的FireBug工具,但是还不完善!
这次请求时从服务器返回的数据,最重要的是在请求头中增加两个请求项Pragma:no-cache 和Cache-Control:no-cache,为什么会增加这两项配置,它有什么作用呢?

1 Cache-Control/Pragma
这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道页面是否为缓存,不仅可以控制浏览器,还可以控制
和HTTP协议相关的缓存代理服务器,HTTP Head 字段有一些可选值,这些值及其说明如下:

Cache-Control请求字段被各个浏览器支持的较好,而且他的优先级比较高,它和其他一些请求字段(如Expires)同时出现,Cache-Control会覆盖其他字段
Pragma 字段的作用和Cache-Control有点类似,他也是在HTTP头中包含一个特殊的指令,使相关的服务器来遵守,最常用的就是
Pragma:no-cache 它和 Cache-Control:no-cache的作用是一样的!
2 Expires
Expires通常的使用格式是 Expires: Sat, 25 Feb 2012 12:22:17 GMT后面跟着一个日期和时间,超过这个时间值后,缓存的内容将失效,也就是浏览器在发出请求之前检查这个字段,看该页面是否已过期,过期了就重新向服务器发起请求
3 Last-Modified/Etag
Last-Modified/Etag字段一般用于表示一个服务器上的资源最后修改时间,资源可以是静态或者动态内容通过这个最后修改时间可以判断当前请求
的资源是否是最新的
一般服务端在相应头返回 Last-Modified字段,告诉浏览器这个浏览器的最后修改时间,如:Last-Modified: Sat, 25 Feb 2012 12:55:04 GMT
浏览器在此请求时在请求头中增加一个If-Modified-Since: Sat, 25 Feb 2012 12:55:04 GMT字段,询问当前缓存的页面是否是最新的,如果是最新的就返回3.4状态码,告诉浏览器是最新的! 服务器也不会传输新的数据
与Last-Modified字段类似的功能还有一个类似Etag字段,这个字段的作用是让服务器给每个页面分配一个唯一的编码,然后通过这个编号来区分
当前这个页面是否是最新的这种方式比使用 Last-Modified更加灵活,但是在后端Web服务器有多台时比较难处理,因为每个Web服务器都要记住网站的所有资源,否则浏览器返回这个编号就没有意义了

浙公网安备 33010602011771号