社区首页 > 专栏 > 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() 实体名称 传递的参数如何获取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:服务器和浏览器的连接状态 响应信息的作用:开发者需要设置响应信息 修改响应信息方式响应行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 原理 注意文件下载 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")) 本文参与
腾讯云自媒体同步曝光计划 ,分享自微信公众号。
原始发表:2017-12-23,如有侵权请联系
cloudcommunity@tencent.com 删除