本篇博文主要包含:
- 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、请求资源
- URL: 统一资源定位符,http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI的子集。
- URI: 统一资源标记符。/day09/hello。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html), 可以是互联网。
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”);