1. 目录
1.1. HTTP 状态保持
- URL重写
- 隐藏域
- cookies
- sessions
1.2. Servlet
- Spring Boot注册过滤器
Filter
1.3. Spring MVC
- 转发
- 重定向
- 请求参数
@RequestParam
- 路径变量
@PathVariable
- 模型属性
@ModelAttribute
2. HTTP 状态保持
2.1. URL重写
2.2. 隐藏域
2.3. Cookie
2.3.1. 特性
- 由服务端生成,可以通过HTTP头发送给浏览器,由浏览器存储在本地;
- 浏览器在访问同一Web服务器时,会将之前收到的Cookie携带在HTTP请求头中一并发送。
Cookie的缺陷
- cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- cookie在HTTP请求中是明文传递的,所以安全性成问题。(除非用HTTPS)
- cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
- 用户出于安全考虑,可以通过改变浏览器设置拒绝接受cookies。
2.3.2. 创建Cookie
import javax.servlet.http.Cookie;
Cookie cookie = new Cookie(name, value);
2.3.3. Cookie的属性
- domain:
- path:
- maxAge:cookie的过期时间。
- httpOnly:
2.3.4. 服务器发送Cookie到浏览器
- 接口:
HttpServletResponse#addCookie(Cookie):void
服务器端发送cookie给客户端,使用HTTP头的Set-Cookie
字段。包括了对应的cookie的名称,值,以及各个属性。例如:
Set-Cookie: lu=YLjVg7qi3bZjzgRg3vHJZneh; Expires=Tue, 15 Jan 2021 22:37:38 GMT; Path=/; Domain=.it168.com; HttpOnly
Set-Cookie: made_write_conn=1295214458; Path=/; Domain=.it168.com
Set-Cookie: reg_fb_gate=deleted; Expires=Thu, 01 Jan 1970 00:00:01 GMT; Path=/; Domain=.it168.com; HttpOnly
2.3.5. 浏览器提交cookie到服务端
浏览器发送cookie给服务器的时候,是不发送cookie的各个属性的,而只是发送对应的名称和值。使用HTTP头的Cookie
字段:
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Accept: */*
服务端提取Cookie使用如下接口:HttpServletRequest#getCookies():Cookie[]
。
2.3.6. 查找指定名称的Cookie
public static Cookie findCookie(String cookieName) {
if (cookieName == null) {
return null;
}
for (Cookie c : httpServletRequest.getCookies()) {
if (cookieName.equals(c.getName())) {
return c;
}
}
return null;
}
2.3.7. 删除Cookie
创建一个同名Cookie,设置maxAge为0,添加到HttpServletResponse中,相当于删除同名cookie:
Cookie cookie = new Cookie("name", "");
cookie.setMaxAge(0);
httpServletResponse.addCookie(cookie);
2.4. Session
2.4.1. 特性
- 由服务端创建和维护,不会发送给客户端,只会将其唯一ID发送给客户端
- 服务端发送Session id给客户端通常有两种方式:(1)创建一个名为JSESSIONID的cookie,其值为会话ID,(2)在URL后附加一个名为jsessionid的参数
网友评论