跳至主要內容

Http

HeChuangJun约 2061 字大约 7 分钟

http

1. http协议

  • 超文本传输协议,用于定义WEB服务器和WEB浏览器之间交换数据的过程
  • 特点:HTTP协议默认端口80,响应和请求必须成对,先有请求后有响应
http协议组成组成描述
Http请求协议请求行POST/day09/01.http/from.html HTTP/1.1请求格式的第一行
①请求方式get:请求参数在url后面,例:x.html?a=a&b=b url长度限制get请求数据大小,没有请求体,不安全
Post:请求参数在请求体,长度无限制,安全,除了表单的method为post外,其他都是get请求
②统一资源定位符URl 协议://域名:端口号/资源位置?参数=值
③协议版本
请求头Host:localhost:8080
User-Agent\refer:防盗链(判断它是不是以什么开头就行startswith)
if-modified-since:浏览器最后一次缓存时间
cookie:浏览器缓存的一种
请求体a=a&b=b 一般只有post请求方式才有,都是用户表单提交的数据
Http响应协议响应行HTTP/1.1 200 OK 协议/版本 状态码
200:成功302:重定向304:访问本地缓存404:找不到资源500:服务器内部错误
响应头服务器通过响应头来控制浏览器的行为,不同头浏览器的操作不同
Location:指定响应的路径,需要与状态码302配合使用
Content-Type:响应正文的类型(MIME类型)text/html:charset=UTF-8
Content-Disposition:通过浏览器以下载的方式解析正文attachment;filename=xx.zip
Set-Cookie:服务器向浏览器写入cookie
响应体服务器发给浏览器的正文、响应体是服务器回写给客户端的页面正文
浏览器将正文加载到内存,然后解析渲染显示页面内容
http请求.png
http请求.png
http响应.png
http响应.png
可以用 telnet 程序测试 telnet 192.168.80.1 8080
get 请求示例

GET /test2?name=1i&age=10 HTTP/1.1
Host:1ocalhost

post 请求示例
PosT /test2 HTTP/1.1 
Host: localhost
Content-Type:application/x-www-form-urlencoded
Content-Length:10

name=zhang&age=10

// java求urlencode utf-8
bytel]bytes ="张".getBytes(standardcharsets.UTF_8);
System.out.println(bytes);
bytes:[-27,-68,-96]
右键-查看方式-Hex查看16进制

application/x-www-form-urlencoed 格式细节
。参数分成名字和值,中间用=分隔
。多个参数使用 & 进行分隔
。【张】等特殊字符需要用 encodeURIComponent()编码为【%E5%BC%A0】后才能发送
encodeURIComponent("张")
%E5%BC%AB

可以用谷歌浏览器的控制台求数据长度
"name=zhang&age=18".length
求urlencode

json 请求示例
PosT /test3 HTTP/1.1
Host: 1ocalhost
Content-Type:application/json
Content-Length:25
{"name": "zhang" , "age" : 18}

后端@RequestBody对象接收
{"属性名":属性值}
字符串"”
数字
true, false
null
属性值中文也可以,不用urlencode
求长度'{"name":"张","age":18}'.length

multipart 请求示例
PosT /test2 HTTP/1.1
Host: 1ocalhost
Content-Type:mutipart/form-data;boundary=123
content-Length:125

--123
Content-Disposition:form-data;name-"'name

1isi
--123
Content-Disposition:form-data; name="age"

39
--123--

boundary=123 用来定义分隔符
起始分隔符是 --分隔符
结束分隔符是 --分隔符--

使用length计算时,会忽略/r/n,导致len减少

客户端发送
编码
o application/x-www-form-urlencoded :url 编码
o application/json: utf-8 编码
o multipart/form-data:每部分编码可以不同
表单只支持以 application/x-www-form-urlencoded 和multipart/form-data 格式发送数据
文件上传需要用 multipart/form-data 格式
js 代码可以支持任意格式发送数据

服务端接收
对application/x-www-form-urlencoded 和multipart/form-data格式的数据,Spring 接收方式是统一的,只需要用java bean 的属性名对应请求参数名即可
对于 applicaiton/json 格式的数据,Spring 接收需要使用@RequestBody 注解+java bean 的方式

session 原理
Http 无状态,有会话
。无状态是指,请求之间相互盘立,第一次请求的数据,第二次请求不能重用name=zhang
,有会话是指,客户端和服务端都有相应的技术,可以暂存数据,让数据在请求间共享
服务端使用了 session 技术来暂存数据
存
GET /s1?name=zhang HTTP/1.1
Host: 1ocalhost
取
GET /S2 HTTP/1.1
Host: 1ocalhost
Cookie:ISESSIONID=BF219FEFB6FF6960DA2537CDDED6C393

@RequestMapping("/s1")
@ResponseBody
public string sl(
HttpSession session,string name){
	session.setAttribute( name:"name", name);
	return"数据已存储";
}
@RequestMapping("/s2")
#ResponseBody
public string s2(Httpsession session){
	return "取出数据"+session.getAttribute( name:"name");
}

生成 token
GET /j1?name=zhang&pass=123 HTTP/1.1
Host: 1ocalhost

校验 token
GET /2 HTTP/1.1Host:1ocalhost
Authorization:
eyihbGcioijIuzIlNi19.eyzdwIioijhzGlpbi19.G4xp74SX4dECKIwhK2kRmj1w157nSAR0OBMSpQ-108

RequestMapping("/j1")
ResponseBody
public string j1(string name,string pass){
	if("zhang".equals(name)&&"123".equals(pass)){
		string token =wts.builder().setsubject(name).signwith(key).compact
		return"验证身份通过:"+token;
    } else {
		return“验证身份失败";
	}
}
RequestMapping("/j2")
ResponseBody
public string j2(@RequestHeader string authorization){
    try {
        System.out.println(authorization);
        Jws<Claims> jws = Jwts.parserBuilder().setsigningKey(key).build().pa
        return“校验通过,你是:"+jws.getBody().getSubject();
    }catch(Exception e){
        return“校验失败";
    }
}

header(签名算法) payload(数据) 签名 最后一段数据与前两个数加服务器的Key签名生成

String token = "eyJhbGci0iJIUzI1NiJ9.eyJzdWIi0iJ6aGFuZyJ9._1-P_TLLZQPb1_LCYGWPLMZaKQ8MCW_PLBbYPZ30X28";

System.out.printin(new string(Base64.getDecoder().decode("eyIhbGci0iJIUzI1NiJ9")));

System.out.printin(new string(Base64.getDecoder().decode("eyJzdWIi0iJ6aGFuZyJ9")));

String str ="""{"sub":"admin"}"“";
System.out.println(Base64.getEncoder().encodeTostring(str.getBytes(standardcharsets.UTF_8)));
1.png
1.png
2.png
2.png

2. Tomcat(轻量级应用服务器,支持Servlet和jsp规范)目录结构(了解)

tomcat目录.png
tomcat目录.png
  • conf:配置文件目录 (config /configuration)
    • 核心配置文件:server.xml
    • 用户权限配置文件:tomcat-users.xml
    • 所有web项目默认配置文件:web.xml
  • bin:脚本目录
    • 启动脚本:startup.bat
    • 停止脚本:shutdown.bat
  • lib:依赖库,tomcat和web项目中需要使用的jar包
    • logs:日志文件.
    • localhost_access_log..txt tomcat记录用户访问信息,星表示时间。
    • 例如:localhost_access_log.2016-02-28.txt
  • temp:临时文件目录,文件夹内内容可以任意删除
    • webapps:默认情况下发布WEB项目所存放的目录
    • work:tomcat处理JSP的工作目录

3. WEB项目目录结构

	项目名称(webapps:)		
	|----静态资源html,css,js
	|---WEB-INF(不能直接通过浏览器进行访问)
		|--web.xml 当前web项目的核心配置,servlet2.5有,3.0省略
		|--lib:依赖库,tomcat和web项目中需要使用的jar包
		|--class:java源码编译后生成的class文件存放的位置

4. 软件架构

软件架构描述
B/S结构(淘宝)浏览器/服务器,通过浏览器和服务器交互,不需要安装其他程序
优点:维护和升级简单,无缝升级、不必安装程序,操作系统内置浏览器
缺点:用户体验受浏览器限制、信息不安全(要用U盾)服务器负荷重(大部分计算在服务器端)
C/S结构(迅雷)客户端/浏览器端,要求客户端安装客户端程序
优点:用户体验不守限制、信息安全、服务器负荷低,部分计算功能在客户端
缺点:占用磁盘空间、维护和升级麻烦、安装依赖其他条件

5. WEB服务器

WEB服务器说明
TomcatApache组织提供的一个免费的小型服务器软件,支持servlet和JSP规范
WebLogicbea公司的一个收费的大型的服务器软件,后被oracle收购,支持ee所有规范
WebSphereIBM公司的一个收费的大型服务器软件,支持ee所有规范
JBoss基于j2ee的开放源代码的应用服务器,管理EJB的容器的和服务器

6. WEB资源:存在于web应用服务器可供外界访问的资源就是web资源

WEB资源说明举例
动态资源web页面中供人们浏览的数据是由程序产生,不同时间点访问web页面看到的内容各不相同JSP/Servlet、ASP、PHP
静态资源web页面中供人们浏览的数据始终是不变HTML、CSS、JS、图片、多媒体