http超文本协议,让http不再难懂(二)

  • 一张导图
  • 导图内容解析
  • http请求
    • 请求行+请求头(多个key-value对象)+一个空行+实体内容
    • 请求行
      • 请求方法
        • 常见方法:get post head trace put delete connect
        • 常用方法:get和post
          • 区别
          • 1、get在URL后面跟上请求数据;post请求数据在实体内容中
          • 2、get提交的数据不超过1kb,post提交的数据没有限制
          • 3、get最好不要用于提交敏感数据
        • 注意:浏览器默认的提交方法是get
      • 请求资源(URI)
        • URL:统一资源定位符,只能定位互联网资源。是URI的一个子集
        • URI:统一资源标记符,用于表示任何资源(本地文件资源、局域网资源、互联网资源)
      • 协议版本
        • http 1.0
          • 当前客户端与服务器建立连接之后,只能发送一次请求,一次请求之后连接关闭
        • http 1.1
          • 当前客户端与服务器建立连接之后,可以在一次连接中发送多次请求
    • 请求头
      • 内容
        • Date 请求发出的时间
        • Accept 浏览器可以接受的数据类型
        • Accept-Charset 浏览器接受的编码格式
        • Accept-Encoding 浏览器接受的数据压缩格式
        • Accept-Language 浏览器可以接受的语言
        • Host (必须)当前请求访问的目标地址
        • If-Modified-Since 浏览器最后的缓存时间
        • Referer 当前请求来自于哪里
        • User-Agent 浏览器类型
        • Cookie 浏览器保存的cookie信息
        • Connection 浏览器跟服务器的链接状态
          • close:连接关闭
          • keep-alive:保持连接
      • HttpServletRequest获取请求头信息
        • 请求行
          • request.getMethod()
          • request.getRequestURI()
          • request.getRequestURL()
          • request.getProtocol()
        • 请求头
          • request.getHeader("请求名称")
          • request.getHeaderNames()
        • 实体名称
          • request.getInputStream()
  • 传递的参数如何获取
    • get方式:参数在URL后面
      • request.getQueryString(); 获取到的参数需要进一步去解析
    • post方式:参数在实体内容中
      • request.getInputStream() 获取到的参数需要进一步去解析
    • 共同的方式
      • request.getParameter("参数名") 获取值只有一个的方式
      • request.getParameterValues("参数名") 获取值有多个的方式
      • request.getParameterNames() 获取所有参数的名称
    • 注意问题:html中编码与getParameter("参数名") 方法中编码方式不一致导致无法获取到正确的参数
      • 解决:
        • 1、重新编码再解码 name = new String(name .getBytes("iso-8859-1"), "utf-8"); name .getBytes("iso-8859-1")将获取到的参数用iso-8859-1(getParameter的解码方式)进行重新编码,然后再用utf-8进行解码,从而获取到正确的参数(中文显示)
        • 2、在调用getParameter之前重新设置查询的码表:request.setCharacterEncoding("utf-8")。该方法只能对实体内容中的数据编码起作用
  • http响应
    • 响应行+响应头+空行+实体内容
    • 响应行
      • 状态码
        • 常见的状态码:
          • 200:处理完成并完美返回
          • 302:请求需要进一步细化
          • 404:客户访问的资源找不到
          • 500:服务器资源发送错误
      • 描述
        • ok
        • not found
        • internal server error
      • 协议版本
    • 响应头
      • 常见的响应头
        • Location:重定向的地址,和302的状态码一起使用
        • Server: 服务器类型
        • Content-Encoding:服务器发送给浏览器的数据压缩类型
        • Content-Length:服务器发送给浏览器的数据长度
        • Conten-Language:服务器支持的语言
        • Content-Type:服务器发送个浏览器的数据类型及内容编码
        • Last-Modified:服务器资源的最后修改时间
        • Refresh:定时刷新
        • Content-Disposition:告诉浏览器以下载的方式打开资源
        • Set-Cookie:服务器发送给浏览器的coolie信息
        • Expires, Cacahe-Control, Pragma:通知浏览器不进行缓存
        • Connection:服务器和浏览器的连接状态
          • close
          • keep-alive
      • 响应信息的作用:开发者需要设置响应信息
  • 修改响应信息
    • 方式
      • 响应行
        • response.setStatus() 设置状态码
      • 响应头
        • response.setHeader(name, value)
    • 实体内容
      • response.getWriter().write() 发送字符实体内容
      • response.getOutputStream().write() 发送字节实体内容
    • 案例
      • 请求重定向
        • 实现:
          • 1、发送302状态码+location响应头 response.setStatus(302)+response.setHeader("location", "url")
          • 2、response.sendRedirect("uri")
        • 原理
          • 浏览器读到302状态码之后,会再次自动向服务器发送一个请求,请求的地址是location的value值
        • 注意:一共向服务器发送两次请求
    • 定时刷新
      • 实现
        • 1、response.setHeader("refresh", "秒数")
        • 2、response.setHeader("refresh", "秒数 ,uri") 隔一定时间跳转到指定的URI
      • 原理
        • 浏览器读到refresh头后重新向服务器发出请求
      • 注意
        • 文件下载 response.setHeader("Content-Disposition", "attachement; filename = "文件名")
    • Content-Type
      • 实现
        • 1、response.setHeader("content-type", "text/html")
        • 2、response.setContentType("text/html")或者response.setContentType("text/html";charset=utf-8 )
    • 注意问题:服务器发送给浏览器数据的中文乱码问题
      • 原因:
        • response.getWriter().write()的默认编码为iso-8859-1;request.getInputStream() .write()取决于write方法字符串参数本身的编码,response.setCharacterCharset("utf-8")不起作用
      • 解决:
        • response.getWriter()之前调用response.setCharacterCharset("utf-8")
        • request.getInputStream() .write("中文".getByte("utf-8"))

原文发布于微信公众号 - java思维导图(java-mindmap)

原文发表时间:2017-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏aoho求索

认证鉴权与API权限控制在微服务架构中的设计与实现:授权码模式

引言: 之前系列文章《认证鉴权与API权限控制在微服务架构中的设计与实现》,前面文章已经将认证鉴权与API权限控制的流程和主要细节讲解完。由于有些同学想了解下授...

63613
来自专栏java 成神之路

Tomcat WebappClassLoader 类加载机制源码分析

3215
来自专栏圣杰的专栏

ABP入门系列(20)——使用后台作业和工作者

源码路径:Github-LearningMpaAbp 1.引言 说到后台作业,你可能条件反射的想到BackgroundWorker,但后台作业并非是后台任务,...

8317
来自专栏后端技术探索

记一次 Nginx URI rewrite 优化

既上一篇文章记录了组内单页引擎升级路由为 History API 方式,考虑到不支持该方式的浏览器/WebView,需要多页降级。如果不对 Nginx 进行配置...

1423
来自专栏noteless

springmvc 项目完整示例08 前台页面以及知识点总结

<%@ page language="java" contentType="text/html; charset=UTF-8"

670
来自专栏代码世界

Cookie、Session登陆验证相关介绍和用法

一、Cookie和Session   首先、HTTP协议是无状态的;所谓的无状态是指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系...

4367
来自专栏角落的白板报

将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1.3X

项目的例子直接使用https://github.com/52ABP/52ABP.School 作为对象,毕竟他正好是.NET CORE 2.0的版本。

821
来自专栏Kirito的技术分享

Re:从零开始的Spring Session(一)

Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了。最近在研究跨域单点登录的实现时,发现对于Session和Cook...

3447
来自专栏有趣的django

python爬虫入门(一)urllib和urllib2

爬虫简介  什么是爬虫? 爬虫:就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输...

4076
来自专栏Pythonista

Django之COOKIE与SESSION

1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要‘保持状态’,因此cookie就是在这个场景下诞生。

1542

扫码关注云+社区

领取腾讯云代金券