java架构学习——16. 深入理解Http协议&反盗链技术&使用时间戳解决浏览器缓存

本篇博文主要包含:

  • http协议内容
  • http协议版本
  • 请求资源URL与URI的区别
  • HttpServletRequest对象
    -传递的请求参数如何获取
  • HttpServletResponse对象
  • 使用时间戳解决浏览器缓存
  • 反盗链技术
    -防盗链原理
    -防盗链的作用
  • 请求重定向
  • 转发和重定向的区别

一、深入理解Http协议
1、什么是http协议
对浏览器客户端和服务器端之间数据传输的格式规范。

2、http协议内容
2.1 请求(浏览器-》服务器)
Accept: text/html,image/* - - 浏览器接受的数据类型
Accept-Charset: ISO-8859-1 - - 浏览器接受的编码格式
Accept-Encoding: gzip,compress - -浏览器接受的数据压缩格式
Accept-Language: en-us,zh-cn - -浏览器接受的语言
Host: www.it315.org:80 - -(必须的)当前请求访问的目标地址(主机:端口)
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT - -浏览器最后的缓存时间
Referer: http://www.it315.org/index.jsp - - 当前请求来自于哪里
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) - -浏览器类型
Cookie:name=eric - - 浏览器保存的cookie信息
Connection: close/Keep-Alive - - 浏览器跟服务器连接状态。close: 连接关闭 keep-alive:保持连接。
Date: Tue, 11 Jul 2000 18:23:51 GMT - - 请求发出的时间

2.2 响应(服务器-》浏览器)
Location: http://www.it315.org/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.it315.org - -表示定时刷新
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:保持连接

3、http协议版本

  • http1.0(短连接):当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭。
  • http1.1(长连接):当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)。

4、请求资源

5.1、HttpServletRequest对象
HttpServletRequest对象作用是用于获取请求数据。
核心的API:

  • 请求行:
    request.getMethod(); 请求方式
    request.getRequetURI() / request.getRequetURL() 请求资源
    request.getProtocol() 请求http协议版本
  • 请求头:
    request.getHeader(“名称”) 根据请求头获取请求值
    request.getHeaderNames() 获取所有的请求头名称
  • 实体内容:
    request.getInputStream() 获取实体内容数据

5.1.1 传递的请求参数如何获取
GET方式: 参数放在URI后面
POST方式: 参数放在实体内容中
获取GET方式参数:
request.getQueryString();
获取POST方式参数:
request.getInputStream();
问题:但是以上两种不通用,而且获取到的参数还需要进一步地解析。所以可以使用统一方便的获取参数的方式:
核心的API:
request.getParameter(“参数名”); 根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames(); 获取所有参数名称列表

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

6、使用时间戳解决浏览器缓存
问题:很多网站在发布版本之前,都会在URL请求地址后面加上一个实现戳进行版本更新,如:http://www.test/xxx.js?t=20181203
使用浏览首次访问某个网站时,浏览器会将js文件、图片等缓存在本地,再次访问时,如果url地址完全相同时,浏览器会从本地缓存中直接获取资源,此时响应状态码为304

7、反盗链技术
7.1 防盗链原理

  • 可以追溯上一个入站地址是什么。
  • 对于资源文件,可以跟踪到包含显示他的网页地址是什么。
    因此所有防盗链方法都是基于这个Referer(请求来源)字段。

7.2 防盗链的作用
为了防止本网站的图片等资源被其他网站直接调用。
在这里插入图片描述
7.3 代码演示
web.xml配置:

	<filter>
		<filter-name>ImgFilter</filter-name>
		<filter-class>com.itmayiedu.filter.ImgFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ImgFilter</filter-name>
		<url-pattern>/static/*</url-pattern>
	</filter-mapping>

过滤器:

public class ImgFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("初始化...");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("doFilter....");
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		//获取请求头中来源
		String referer = req.getHeader("referer");
		//获取当前请求名称
		String serverName = request.getServerName();
		System.out.println("referer:"+referer+"----serverName:"+serverName+":"+serverName);
	    if(referer==null||(!referer.contains(serverName))){
	    	req.getRequestDispatcher("/imgs/error.png").forward(req, res);
	    	return ;
	    }
		chain.doFilter(req, res);
	}

	public void destroy() {

	}
}

8、请求重定向(Location)
在这里插入图片描述
转发和重定向的区别
1.转发在服务器端完成的;重定向是在客户端完成的

2.转发的速度快;重定向速度慢

3.转发的是同一次请求;重定向是两次不同请求

4.转发不会执行转发后的代码;重定向会执行重定向之后的代码

5.转发地址栏没有变化;重定向地址栏有变化

6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

在servlet中调用转发、重定向的语句如下:
//转发到new.jsp
request.getRequestDispatcher(“new.jsp”).forward(request, response);
//重定向到new.jsp,方法一
response.sendRedirect(“new.jsp”);
//重定向到new.jsp,方法二
resp.setStatus(302);
resp.setHeader(“location”, “new.jsp”);

展开阅读全文

没有更多推荐了,返回首页