http协议
http协议概述
- http协议 是一种超文本传输协议,着协议规定了浏览器和万维网服务器之间的通信规则
- 无状态协议:连接一次下次还要重新连接,(相反的是ftp协议是状态协议)
请求行,请求头,空行、请求体
请求行get/hello/index.jsp HTTP/1.1
- get 表示请求方式
- /hello/index.jsp 请求路径,相对于主机
- HTTP/1.1 协议
请求头:
- accept 表示浏览器可以 接受的文件
- accept-lanuge:zh-CN en-US 表示浏览器支持的语言
- user-agent 表示操作系统,浏览器等的信息
- Accept-encoding: gzip支持的压缩格式
- host:localhost 请求的主机
- Connection :Keep-Alive 保持连接一小会
请求体
响应行,响应头,响应体
- 相应行HTTP1.1 200 Ok
- 状态码 200
- 2开头表示成功,3开头转接,4开头客户端错误,5开头服务器错误
- OK 对状态吗的说明
- 状态码 200
- 响应头 (也是键值对的形式)
- Server:Apache-Coycte 表示服务器名字
- set-Cookie
- Content-Type:text/html;charset=ut-8表示 告诉浏览器响应的类型是什么
- Content-Length:34343 响应体的长度
- Date: Tue, 24 Oct 2017 15:00:04 GMT表示服务器时间
- referer头: 表示从哪里来,一半用来防止盗连接(通过判断rederer头是不是我们指定的地址,来判断是不是来盗取资源的),比如:百度可以用来统计广告的点击数量,
- java web 获取request的referer请求头来防止倒链
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//利用referer请求头实现防盗链
public class RequestDemo8 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求是从哪里来的
String referer = request.getHeader("referer");
// 如果是直接输入的地址,或者不是从本网站访问的重定向到本网站的首页
if (referer == null || !referer.startsWith("http://localhost")) {
response.sendRedirect("/day06/index.jsp");
// 然后return,不要输出后面的内容了
return;
}
String date = "日记";
response.getWriter().write(date);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- 空行
- 相应体
- 也就是浏览器请求的资源,在浏览器上显示
- 也就是响应的正文
- Post方式提交表单,表单的中文数据,会自动进行url编码
- get方式不会这样的
相应协议的格式
- 相应行
- 响应头信息
- 空行
- 响应体
响应码概述
- 2开头 请求成功
- 3开头, 重定向
- 4 开头,客户端错误
- 5 开头, 服务器 本身错误
响应码详解
- 200 请求成功
- 301 永久重定向,一半用来面上搜索引擎,跟换域名的时候,可以将旧的域名设置为301,那么搜索引擎会跳转到新的域名
- 302 临时重定向,表示客户端需要再次请求另一个地址,特点,地址栏的地址会发生变化,如重定向配合的是request的location 头
- 例子:比如访问一个页面,地址栏发生了变换,跳转到了另一个页面
- 304 状态码,比较最后的修改时间,为了让浏览器判断是不是需要再次缓存。
- 400 域名绑定错误,一般是服务器上的域名绑定失败,或者域名没有备案。
- 403 没有访问权限,
- 一般是你的ip地址被列入到了黑名单,或者连接的用户过道,可以稍后再试,网站域名解析到了空间,但是空间没有绑定域名等情况。
- 404 请求的资源是不存在 的,一半都是客户端地址打错了
- 500 请求的资源找到了,但是服务器出错了
- 503 服务器暂时不可以使用
response
- response 的类型分为
- ServletResponse 这个响应和协议无关
- HTTPServletResponse 这个和http协议相关
- respnose返送状态码
- setstatus(int ) 发送成功的状态码
- sendError(int) 发送错误状态码
- sendError(int ,String) 发送错误状态码,并且可以添加错误 信息
- 响应头
- setHeader(String name,String value)适用于单值的 响应头
- addHeader(String name,String value) 使用于多值的响应头
- location 头,重定向
- refresh 头,定时重定向
- 例子:
- Content-Type 头,告诉浏览器响应体的格式,和使用什么编码方式
- 禁用浏览器缓存设置三个响应头
- Cache-Control 值为no-cache
- paragma 值为no-cache
- expires 值是一个负数
- html文件中的meta标签也可以充当响应头
- 比如:
- 响应体 ,通常是html,图片,主要是两个流
- response.getOutputStream();方法返回ServletOutputStream 向客户端发送字节数据
- response.getWriter()方法返回printWrite 向客户端发送字符数据,设置得到编码的问题
- ==这两个流不能同时使用,否则会出现运行异常==
- 测试同时使用response的两个流
- 结果:
request
请求协议中的 数据都可以通过request对象来获取
- 获取常用的信息(请看Java ee 文档HTTPServvletRequest)
- getMethod()获取 请求 方式
- getRemoteAddr()获取客户端的ip地址
- 获取http请求头
- getHeader(String name)适用于单值的获取 请求头
- getHeader(“User-Agent”)获取浏览器的信息
- getIntHeader(String name)适用于单值类型的int类型的请求头
- getHeaders(String name)适用于多值的请求头
- 获取请求URL
- getScheme() 获取请求协议
- getServerName()获取请求额服务器的主机名
- getServerPort()获取请求的服务器的端口
- getContextPath()获取 项目名
- getServletPaht()获取servlet 的路径
- getQueryString()获取参数部分
- getRequestURI()获取请求的URI相当于项目路径+servlet路径
- getRequestURL()获取请求URL,相当于不包含参数的整个路径
- 获取请求的参数
- getParameter(String name) 获取指定名称的参数值,适用于单值的请求参数
- getParameterValues(String name)获取指定名称的参数值,适用于多值的请求参数
- getParameterMap():获取所有的请求参数,其中key为参数名,value为参数的值
请求转发和请求包含
如果一个请求需要多个Servlet协助完成就可以使用亲请求转发和请求包含
- 请求转发:转发的Servlet完成响应体
- request.getRequestDispatcher(转发路径,不需要带项目名).forward(request,response)
- request.getRequestDispatcher(转发路径不需要带项目名).include(request,response)
- 请求包含:转发的和被转发的共同完成响应体
- 无论是请求转发还是请求包含都是在一个请求 内完成响应
请求转发和重定向区别
- 重定向是两个请求,转发是一个请求
- 重定向是客户端重新请求了另一个地址,客户端地址栏发生了变化,但是转发是同一个请求,地址栏不发生变化
请求转发和请求包含的区别
- 请求转发是由转发的serlvet完成响应体的 处理
- 但是请求包含是由转发的Servlet和被转发的Servlet共同完成的