Http知识总结

请求部分:

Http请求行分析:

Request URL: https://zhidao.baidu.com/         ------请求的url地址
Request Method: GET                            ------请求方式
Status Code: 200 OK                            ------响应状态码
Remote Address: 180.149.131.245:443            ------请求的ip地址与端口号
Referrer Policy: no-referrer-when-downgrade    ------仅当发生协议降级
如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则是现在大部分浏览器默认所采用的;

 

Http请求头分析:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8     ------接受的请求类型
Accept-Encoding: gzip, deflate, br    ------压缩格式
Accept-Language: zh-CN,zh;q=0.9       ------语言编码格式
Connection: keep-alive        ------Http1.1默认是长连接,Http1.0默认是短连接
Cookie: BAIDUID=6F807D31BA059DA4BE0DE2416FB5838B:FG=1; BDUSS=xtYVhLb35adUhnREtFTFIwZ2ltUjNMOXRITFNNVUY3TGUwWnMwdERMdzQxNTliQVFBQUFBJCQAAAAAAAAAAAEAAAA-1LOmx9q33LXEwtyyt9Prv9MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhKeFs4SnhbN2; cflag=15%3A3; BIDUPSID=6F807D31BA059DA4BE0DE2416FB5838B; PSTM=1535862900; H_PS_PSSID=1463_21100_26350_22159    
Host: zhidao.baidu.com                ------host名称
Referer: http://news.baidu.com/       ------请求来源 企业用作白名单黑名单、防盗链
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

 

HttpServletRequest对象

//HttpServletRequest对象作用是用于获取请求数据。
//核心的API:
		//请求行: 
		request.getMethod();     //请求方式
		request.getRequetURI()   //request.getRequetURL()   请求资源
		request.getProtocol()    //请求http协议版本
					
		//请求头:
		request.getHeader("名称")    //根据请求头获取请求值
		request.getHeaderNames()    //获取所有的请求头名称

		//实体内容:
		request.getInputStream()   //获取实体内容数据

 

 

请求资源

  URL:  统一资源定位符。http://localhost:8080/mall/login.html。只能定位互联网资源。是URI的子集。

 URI: 统一资源标记符。/mall/login.html。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.4.65/myweb/index.html),可以是互联网资源。

 

什么是时间戳?

很多网站在发布版本之前,都会在URL请求地址后面加上一个实现戳进行版本更新,使用时间戳防止浏览器缓存

因为一些静态资源在初次访问时候先会从服务器中获取资源(JS、图片、Css等),状态码为200。当第二次访问同样的资源时,若静态资源在本地浏览器已缓存(通过静态资源的请求地址来判断是否已缓存),返回状态码304。且第二次访问速度要比第一次快很多,因为省去了获取静态资源的时间,这是浏览器端的优化,它提高了响应速度,但也带来一些问题。当你发布新版本静态资源的时候,如你更新图片,但图片的名称与之前图片名称一致的话,浏览器不会向服务端获取图片,而是从本地缓存中得到图片。那么会导致用户无法查看到最新的图片资源。当然,可以通过清理缓存处理,更合适的做法是在静态资源后加入时间戳,那么每次发布后由于更新前后时间戳不同,最新的资源总会从服务器端获取。如<img src = "imgs/ads.png?t=2018-9-2"></img>

 

防止非法链接(referer)——防盗链

防止A网站通过非法链接,盗用B网站的资源。如B网站有一个图片资源为: www.b.com/imgs/a.png,那么通过设置防盗链后A网站不能直接访问盗用www.b.com/imgs/a.png资源。

以上就是从b.b.com中盗用了a.a.com的资源。

发生盗用的本质原因就是:Referer来源地址与Request URL请求地址不一致。

解决办法——防盗链机制

1、使用Java代码控制请求来源资源判断Referer,使用过滤器获取请求头的来源字段,判断Referer是否为a.a.com。

2、使用nginx反向代理解决防盗链

 

具体代码实现:

package cn.itcats;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyFilter implements Filter{
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("MyFilter被初始化了");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("------------------doFilter------------------");
		HttpServletRequest req = (HttpServletRequest) request ;
		HttpServletResponse res = (HttpServletResponse) response;
		//获取Referer
		String referer = req.getHeader("Referer");
		//获取请求的服务名称  a.a.com
		String serverName = req.getServerName();
		System.out.println("Referer:"+referer+"  serverName:"+serverName);
		//referer情况为不通过网站,直接访问图片,如  a.a.com/imgs/a.png
		if(referer == null || ! referer.contains(serverName)){
			//referer不包含serverName,为盗用,显示/imgs/error.png
			req.getRequestDispatcher("error.png").forward(req, res);
			return ;
		}
		//放行
		chain.doFilter(req, res);
	}

	public void destroy() {
		
	}

}

web.xml配置filter

 <!-- 配置Filter -->
    <filter>
    	<filter-name>MyFilter</filter-name>
    	<filter-class>cn.itcats.MyFilter</filter-class>
    </filter>
    
    <filter-mapping>
    	<filter-name>MyFilter</filter-name>
    	<url-pattern>/imgs/*</url-pattern>
    </filter-mapping>

 

 

响应部分:

常见的响应头

Location: http://www.itcats.cn/index.jsp   -表示重定向的地址,该头和302的状态码一起使用。

Server:apache tomcat                                 ---表示服务器的类型

Content-Encoding: gzip                              -- 表示服务器发送给浏览器的数据压缩类型

Content-Length: 80                                     --表示服务器发送给浏览器的数据长度

Content-Language: zh-cn                           --表示服务器支持的语言

Content-Type: text/html; charset=GB2312   --表示服务器发送给浏览器的数据类型及内容编码

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT  --表示服务器资源的最后修改时间

Refresh: 1;url=http://www.itcats.cn              --表示定时刷新

Content-Disposition: attachment; filename=aaa.zip --表示告诉浏览器以下载方式打开资源(下载文件时用到)

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --表示服务器发送给浏览器的cookie信息(会话管理用到)

Expires: -1                                                      --表示通知浏览器不进行缓存

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive           -       -表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接

 

状态码: 服务器处理请求的结果(状态)

常见的状态:

200:   表示请求处理完成并完美返回

302:   重定向

304:   读取本地缓存

403:    参数错误

404:   表示客户访问的资源找不到。

500:   表示服务器的资源发送错误。(服务器内部错误)

502:    正在发布

 

常用的响应API

//HttpServletResponse对象修改响应信息:
	//响应行: 
	response.setStatus(int status)          //设置状态码
	//响应头: 
	response.setHeader("name","value")      //设置响应头
	//实体内容:
	response.getWriter().writer();          // 发送字符实体内容
	response.getOutputStream().writer()     //发送字节实体内容 

 

重定向实现原理

重定向的API:response.sendRedirect("ToServlet");本质上可以替换成下面这两句代码:

response.setStatus(302);
response.setHeader("Location", "ToServlet");

服务器设置状态码为302,且响应体中为key为"Location",浏览器通过判断状态码为302,寻找响应体中为"Location"的key,发送二次请求到ToServlet,完成重定向。本质上对服务器端进行了两次请求。

 

重定向与转发的区别:

  1. request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。
    response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。
    所以转发中数据的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的数据的。只能用session。

  2. forward()更加高效,在可以满足需要时,尽量使用RequestDispatcher.forward()方法。

  3. RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。
    sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。

  4. 重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问

 

Http与Https区别

    1、https 协议需要到CA (Certificate Authority)申请证书,一般免费证书较少,因而需要一定费用。

 2http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。

 3http https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443

 4http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。

 

https工作原理?

我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。

 客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤,如图所示。

  (1)客户使用 https URL 访问 Web 服务器,要求与 Web 服务器建立 SSL 连接。

  (2Web 服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

  (3)客户端的浏览器与 Web 服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。

  (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

  (5Web 服务器利用自己的私钥解密出会话密钥。

  (6Web 服务器利用会话密钥加密与客户端之间的通信。

 

https优缺点?

 虽然说 HTTPS 有很大的优势,但其相对来说,还是存在不足之处的:

  (1HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近 50%,增加 10% 20% 的耗电;

  (2HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;

  (3SSL 证书收费,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

    4SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗。

  (5HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。

 

 

http长连接与短连接

长连接与短连接的操作过程 


通常的短连接操作步骤是: 
连接(三次握手)→数据传输→关闭连接(四次挥手);

而长连接通常就是: 
连接(三次握手)→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(四次挥手); 

这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,
短连接在没有数据传输时直接关闭就行了

长连接什么时候关闭?

1、配置失效心跳检测时间,客户端没有继续建立连接,直接关闭。

2、客户端主动关闭

3、tomcat服务器配置长连接超时时间20分钟

4、设置响应头Keep-Alive: timeout。这个值能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。

长连接和短连接的使用场景

长连接:Http1.1默认使用长连接,一般网址都是用长连接、rpc远程调用——dubbo底层通过netty使用长连接、移动端APP消息推送等。

短连接:调用别人的接口,使用不是特别频繁,一般使用短连接

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值