HTTP协议概述
1.什么是HTTP协议?
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写。属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
2.HTTP链接以及数据传递
HTTP协议在建立链接和进行数据传递的时候使用的是URL(统一资源标识符,Uniform Resource Identifiers),一般的一个URL地址中就包含了需要访问资源的诸多信息以及所需的参数信息。如:http://localhost:8080/0203/HelloWorld
(1).协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。
(2).域名部分:该URL的域名部分为“localhost”,标识本地。一个URL中,也可以使用IP地址作为域名使用
(3).端口部分:8080标识跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符,8080作为Tomcat默认的端口号。端口不作为URL必须的部分,如果端口号省略,表示使用默认端口号。
(4).虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。一般在web中使用的是部署在服务器上运行的项目,如:/0203
(5).文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,一般就是访问项目路径的入口地址,一般就是登陆页面或者是初始化项目的访问路径,如:/HelloWorld
(6)参数部分:在文件名部分后面可传递一些参数,需要使用"?"表示传递参数的开始,然后如果需要传递多个参数,那么就是用"&"连接,参数使用键值对的形式传递。
3.HTTP请求的方法
按照HTTP的标准,可以使用多种请求的方法。一般常见的有以下几种:
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4.HTTP工作流程
2.HTTP协议常见的状态码
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
GET请求
1.Get请求的执行过程:
请求表单:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="HelloWorld" method="post">
username:<Input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
请求资源servlet
package com.cn.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name="HelloWorld",urlPatterns="/HelloWorld")
public class HelloWorld extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("请求已接收!!");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("welcome to send application," + req.getParameter("username"));
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
}
发送Get请求 URL:http://localhost:8080/0203/HelloWorld?username=admin&password=123
Get发送的请求信息:
服务器资源信息反馈显示结果:
2.GET请求总结
(1).GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接。
(2).使用GET提交,传递的参数的参数大小会有限制,尽管HTTP协议是不限制大小的,但是会在浏览器上限制传递参数的大小。
(3).由于GET请求提交的参数是附着在URL后面,所以通过GET提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存;其他人查看浏览器的历史纪录,就可以获取你传递的数据信息。
(4).GET请求的参数是以键值对的形式合并在URL上
POST请求
1.POST请求执行过程
请求表单:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="HelloWorld" method="post">
username:<Input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
请求Servlet同上
发送的Post请求URL:http://localhost:8080/0203/HelloWorld
POST发送的请求信息:
服务器资源信息反馈显示结果:
2.POST请求总结:
(1).POST请求提交的数据放置在是HTTP包的包体中。
(2).POST请求可以传递的参数由于不是在URL后面,所以,可以传递的数据量是比较大的。
(3).POST请求安全性比GET请求的安全性要高
(4).POST请求参数是在http标题的一个不同部分传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form- urlencoded。POST请求的参数也是作为key/value对传输。