1.HTTP的概念:
Hyper Text Transfer protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
*特点:
1.基于TCP/IP的高级协议
2.默认端口号:80
http://www.itcast.cn:80
3.基于请求/响应模型的:一次请求对应一次响应
4.无状态的:每次请求之间相互独立,不能交互数据
*历史版本
*1.0:每一次请求响应都会建立新的连接
*1.1:复用连接
*请求消息数据格式
1.请求行
请求方式,请求url 请求协议/版本
GET /login.html HTTP/1.1
*请求方式:
*HTTP协议有7种请求方式,常用的有2种
*GET:
1.请求参数在请求行中,在url后。
2.请求的url长度是有限制的
3.不太安全
*POST:
1.请求参数在请求体中
2.请求的url长度是没有限制的
3.相对安全
2.请求头:客户端浏览器告诉服务器一些信息
请求投名称:请求头值
*常见的请求头:
1.UserAgent:浏览器告诉服务器,我访问你使用的浏览器的版本信息
*可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2.Referer:http://locahost/login.html
1.告诉服务器,我(当前请求)从哪里来?
*作用
1.防盗链:
2.同级工作:
3.请求空行
空行,就是用于分隔POST请求的请求头,和请求体的。
4.请求体(正文)
*封住POST请求信息的请求参数的
2.Request
1.request对象和response对象的原理
1.request和response对象是由服务器创建的,我们来使用它们
2.request对象是来获取请求消息,response对象是来设置响应消息
整个过程如图所示:
2.request对象继承体系结构:
ServletRequest --- 接口
| 继承
HttpServletRequest --- 接口
| 实现
org.apache.catalina.connector.RequestFacade@10133f0 类(tomcat)
3.request功能:
1.获取请求消息数据
1.获取请求行数据
*GET /day14/demo1?name=zhangsan HTTP/1.1
*方法:
1.获取请求方法:GET
*String getMethod()
2.(*)获取虚拟目录:/day14
*String getContextPath()
3,获取Servlet路径:/demo1
*String getServletPath()
4.获取get方法请求参数:name=zhangsan
*String getQueryString()
5.(*)获取请求URL:/day14/demo1
*String getRequestURI(): /day14/demo1
*StringBuffer getRequestURL() :http://localhost/day14/demo1
*URL:统一资源定位符:http://localhost/day14/demo1
*URI:统一资源标识符:/day14/demo1
6.获取协议及版本: HTTP/1.1
*String getProtocol()
7.获取客户机的IP地址
*String getRemoteAddr()
具体例子如下:
package cn.itcast.web.request;
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;
/*
*演示Request对象获取请求行数据
*/
@WebServlet("/RequestDemo1")
public class request extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
1.获取请求方法:GET
*String getMethod()
2.(*)获取虚拟目录:/day14
*String getContextPath()
3,获取Servlet路径:/demo1
*String getServletPath()
4.获取get方法请求参数:name=zhangsan
*String getQueryString()
5.(*)获取请求URL:/day14/demo1
*String getRequestURL(): /day14/demo1
*StringBuffer getRequestURL() :http://localhost/day14/demo1
6.获取协议及版本: HTTP/1.1
*String getProtocol()
7.获取客户机的IP地址
*String getRemoteAddr()
*/
//1.获取请求方式
String method = request.getMethod();
System.out.println(method);
//2.获取虚拟目录
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3,获取Servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4.获取get方法请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//5.(*)获取请求URL
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6.获取协议及版本
String protocol = request.getProtocol();
System.out.println(protocol);
//7.获取客户机的IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
}
结果如下:
GET
/day12_servlet_war_exploded
/RequestDemo1
null
/day12_servlet_war_exploded/RequestDemo1
http://localhost:8080/day12_servlet_war_exploded/RequestDemo1
HTTP/1.1
0:0:0:0:0:0:0:1
2.获取请求头数据
*方法:
* String getHeader(String name):通过请求头的名称获取请求头的值
*Enumeration<String> getHeaderNames():获取所有的请求头名称
代码如下:
package cn.itcast.web.request;
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("/requestdemo4")
public class Requestdemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据:referer
String referer = request.getHeader("referer");
System.out.println(referer);
//防盗链
if(referer != null){
if (referer.contains("/day12_servlet_war_exploded")){
//正常访问
System.out.println("播放电影......");
}else{
//盗链
System.out.println("想看电影吗?来优酷");
}
}
}
}
结果如下:
http://localhost:8080/day12_servlet_war_exploded/login.html
播放电影.........
3.获取请求体数据
*请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
*步骤:
1.获取流对象
*BufferedReader getReader(): 获取字符输入流,只能操作字符流数据
*ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
*在文件上传知识点后讲解
2.再从流对象中获取数据