http协议
1.1 http协议的基本概念
1.1.1 http协议的简介:
- 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force)共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616 定义了HTTP1.1 。
2.1.2 HTTP协议的作用:
- 互联网的数据传输底层依赖于tcp协议,HTTP协议架构在tcp协议之上,它规范了传输数据的内容和格式。
2.1.3 HTTP协议的应用场景:
刷屏软件:
- 刷屏软件的原理其实是通过观察12306查阅剩余票数需要发出的参数,然后自己编程拼接服务器所需要的参数发送给服务器,然后接受服务器的数据。如果需要查看12306发出的请求参数格式,那么就必须要了解HTTP协议。
智能家居:
- 智能家居在我们的生活中地位越来越重要了,手机是如何操作我们的家庭设备的呢?其实也是手机软件通过拼接参数,然后发送给电饭煲,这个过程也是需要用到HTTP协议的。不管是刷屏软件还是智能家居都需要知道服务器要何种格式的数据,那么我们怎么才能知道呢?这时候就可以查看浏览器与服务器的通讯过程。
2.2 HTTP协议数据查看方式
2.2.1 浏览器查看浏览器与服务器通讯过程:
- 查看 HTTP协议内容的工具,一般有两个:
2.2.1.1 Chrome(谷歌)---按键f12:
2.2.1.2.firefox(火狐)——按键f12:
2.3 请求信息的组成部分:
- 目的是了解浏览器将哪些数据,按照什么样的格式发送给服务器。 http请求一共分为三个部分:请求行、请求头、请求体。
2.3.1 http协议数据查看准备:
1.创建一个工程ServletTest04,在web文件夹准备一个1.html,内容为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<form action="1.html?name=admin" method="post">
<input type="text" name="username"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
1. 地址栏输入http://localhost:8080/ServletTest04/1.html 测试效果(get 请求)
2. 启动服务器测试,访问1.html
2.3.2. Http 请求数据的组成 :
2.3.3. 请求行
请求行介绍
请求行:POST /ServletTest04/1.html HTTP/1.1
POST:请求方式
/ServletTest04/1.html:访问路径
HTTP/1.1 :http 协议的版本
问:get 和post 请求方式的区别?
get请求方式 | post请求方式 | |
数据长度是否有限制 | 是 | 否 |
是否包含请求体 | 否 | 是 |
数据是否暴露在地址栏 | 是 | 否 |
2.3.4 请求头
请求头内容:
Host: localhost:9090(服务器的域名)
Connection: keep-alive (网络连接是持久的)
Content-Length: 12 (发送数据的大小,单位字节)
Cache-Control: max-age=0 (设置缓存数据的存活时间,单位秒)
Origin: http://localhost:9090 (指示了请求来自于哪个站点——服务器名称)
Upgrade-Insecure-Requests: 1 (如果存在更安全的响应,客户端优先选择加密及带有身份验证的响
应)
Content-Type: application/x-www-form-urlencoded (发送数据的媒体类型——发挥作用类似后缀
名:.mp3 .avi)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/63.0.3239.132 Safari/537.36 (当前系统和浏览器版本)
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.
8
Referer: http://localhost:9090/day01/1.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=98006861B5044ACC8D5C7840C93C17DA
- 想要知道这些请求头是干什么的,可以使用火狐浏览器的功能,详细可以回看--浏览器查看浏览器与服务器通讯过程。
- 在这些所有的请求头中,比较重要的有两个:
Referer: http://localhost:9090/day01/1.html
上一次请求的地址
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/63.0.3239.132 Safari/537.36
当前用户的系统和浏览器版本。
2.3.5请求体
请求体内容:
- 注意:get请求没有请求体,post请求有请求体。
- 了解了http协议相关的内容,我们还需要可以在服务器获取这些数据,才能处理用户的请求,需要使用到一个对象Request。
3.request对象获取请求信息
3.1 request对象的基本概念:
- 什么是HTTPServletRequest:HTTPServletRequest对象代表客户端的请求,当客户端通过Http协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
以下是API 文档中的介绍:
- 通过文档阅读可以注意到一个细节HttpServletReuqest 不是相关请求的*接口,它继承自父接
口——ServletRequest:
3.2 request获取请求行信息
3.2.1 请求行的组成元素(通过request获取请求行数据):
- 在HTTP协议中我们已经知道了http协议中请求行的内容--分为请求方式、请求路径、协议版本;在HTTPServletRequest中我们知道浏览器与请求相关的数据封装在request中,因此,我们需要知道如何使用request对象获取请求行的数据。
3.2.2API介绍:
String getMethod() 获取请求方式的类型
2. String getRequestURI() 获取请求行中的资源名部分
3. StringBuffer getRequestURL() 获取客户端发出请求完整URL
注:
uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)
url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资源.
(相当于身份证中的地址)
4. String getProtocol() 获取当前协议的名称和版本
5. String getRemoteAddr() 获取IP 地址
6. int getLocalPort() 获取端口
3.2.3 使用步骤:
创建RowServlet
在RowServlet中的doGet或者doPost方法的参数列表,已经包含了request对象,调用方法即可,
将数据输出在控制台。
package com.sunny.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RowServlet",urlPatterns = "/RowServlet")
public class RowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request获取请求数据
//格式 POST http://www.baidu.com/?password=123456 HTTP/1.1
//1.获取请求方法类型
String method = request.getMethod();
//2.获取请求的URL
String url = request.getRequestURL().toString();
//3.获取请求的uri
String uri = request.getRequestURI();
//4.协议版本
String protocol = request.getProtocol();
//5.客户端的ip
String ip = request.getRemoteAddr();
//本地使用localhost访问,服务器会返回ip:0:0:0:0:0:0:0:1,ipV6,需要重新使用ipV4 地址访问就可以
//打印
System.out.println("method:"+method);
System.out.println("url:"+url);
System.out.println("uri:"+uri);
System.out.println("protocol:"+protocol);
System.out.println("ip:"+ip);
}
}
效果一测试地址:http://localhost:8080/ServletTest05/RowServlet
/*输出结果*/
method:GET
url:http://localhost:8080/ServletTest05/RowServlet
uri:/ServletTest05/RowServlet
protocol:HTTP/1.1
ip:0:0:0:0:0:0:0:1
method:GET
url:http://localhost:8080/ServletTest05/RowServlet
uri:/ServletTest05/RowServlet
protocol:HTTP/1.1
ip:0:0:0:0:0:0:0:1
method:GET
url:http://localhost:8080/ServletTest05/RowServlet
uri:/ServletTest05/RowServlet
protocol:HTTP/1.1
ip:0:0:0:0:0:0:0:1
- 获取请求方式的类型:GET
- 获取请求行中的资源名部分:/ServletTest05/RowServlet
- 获取客户端发出请求完整URL:http://localhost:8080/ServletTest05/RowServlet
- 获取当前协议的名称和版本:HTTP/1.1
- 获取IP地址:0:0:0:0:0:0:0:1
- 获取端口:8080
效果二测试地址: http://127.0.0.1:8080/ServletTest05/RowServlet
method:GET
url:http://127.0.0.1:8080/ServletTest05/RowServlet
uri:/ServletTest05/RowServlet
protocol:HTTP/1.1
ip:127.0.0.1
- 为什么要测试两次:我们会发现两次打印的ip地址是不一样的,因为注意Localhost和127.0.0.1效果一致,但是Localhost默认使用ipv6本机地址---0:0:0:0:0:0:0:1,而127.0.0.1 是ipv4 的本机地址。
3.3 request获取请求头信息
3.3.1 获取请求头信息常用的方法:
3.3.1.1API介绍:
String getHeader(String name) 以String 的形式返回指定请求头的值
2. Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举
3.3.1.2 使用步骤:
创建DemoServlet2
在DemoServlet2中的doGet或者doPost方法的参数列表,已经包含了request对象。因此,调用方法即可。
将结果打印在控制台
package com.sunny.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(name = "DemoServlet2",urlPatterns = "/demo02")
public class DemoServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1.String getHeader(String name)
以String的形式返回指定请求头的值
*/
String header = request.getHeader("User-Agent");
System.out.println("getHeader:"+header);
System.out.println();
/*
2.Enumeration getHeaderNames()
返回此请求包含的所有头名称的枚举
*/
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
System.out.println("getHeaderNames:"+headerNames.nextElement());
}
}
}
getHeader:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
getHeaderNames:host
getHeaderNames:connection
getHeaderNames:upgrade-insecure-requests
getHeaderNames:user-agent
getHeaderNames:accept
getHeaderNames:accept-encoding
getHeaderNames:accept-language
getHeaderNames:cookie
3.3.2. 请求头referer(重点)
3.3.2.1.referer 作用:
- 利用referer获取当前请求的上一个请求资源。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//响应头-referer,作用获取当前请求资源的上一个资源地址
// 特点:如果没有上一个资源就返回null
//1.获取请求头referer 数据
String preUrl = request.getHeader("referer");
System.out.println("上一个资源"+preUrl);
}
test.html
<body>
<a href="/ServletTest05/referer">refererServlet</a>
</body>
先浏览test.html 再轻轻refererServlet,输出的效果
上一个资源http://192.168.101.77:8080/ServletTest/test.html
3.3.2.2.案例:referer 应用——防盗链功能:
3.3.2.2.1.1. 防盗链案例情景
张三自己开发了软性下载的一个网站,然后通过购买域名和大空间将网站发布出去供互联网用户浏览访问,来
到张三网站的用户先浏览广告再下载软件资源,这样张三通过广告就赚钱了,在这里张三购买的空间是比较贵
的,空间越大费用越高。李四看到张三赚到了钱,但是自己不想花钱买大空间,于是自己买了域名和小空间,
软件资源的下载盗取张三的下载地址,这样用户来到李四网站依然看到广告,但是真实下载软件的资源是从张三的空间下载的。这样李四就不用买大空间,就盗取了张三网站的资源。所以张三的网站要针对这样的情况进
行防盗。
3.3.2.2.1.2. 防盗原理实现:
张三的网站在请求资源下载的时候判断当前请求的上一个资源是否是来自张三自己网站的资源。如果上一个资
源是自己网站的资源就允许下载,否则不允许。
上一篇: 第十七节:易混淆的概念(静态和非静态、拆箱和装箱)
下一篇: 多表关联删除常用方法小结