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