http协议

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 对状态吗的说明
  • 响应头 (也是键值对的形式)
    • 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共同完成的
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值