1.状态管理
## (1)什么是状态管理?
将浏览器与web服务器之间多次交互当做一个整体来处理,并且
将多次交互所涉及的数据(即状态)保存下来。
## (2)如何进行状态管理
1)将状态保存在客户端(浏览器)
Cookie
2)将状态保存在服务器端
session
## (3)Cookie
1)什么是Cookie?
服务器临时存放在浏览器端的少量数据
2)工作原理
当浏览器访问服务器时,服务器会将少量数据发送给浏览器
(使用set-cookie消息头),浏览器会将这些数据临时保存下来;
当浏览器再次访问服务器时,会将之前保存的数据发送给服务器
(使用cookie消息头)。
![](cookie.png)
3)添加cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
4)读取cookie
Cookie[] request.getCookies();
注:有可能返回null。
String cookie.getName();
String cookie.getValue();
5)编码问题
a. cookie只能保存合法的ascii字符,如果是中文,
需要将中文转换成合法的ascii字符串。
String URLEncoder.encode(String str,String charset);
String URLDecoder.decode(String str,String charset);
b.建议添加cookie时,都统一编码。
###
6)生存时间问题
a.默认情况下,浏览器会将cookie保存在内存里面。
只有浏览器不关闭,cookie就会一直保存,浏览器一关闭,
cookie就会被删除。
b.cookie.setMaxAge(int seconds)
注:
b1. seconds单位是秒。
b2. 当seconds > 0时,浏览器会将cookie保存在硬盘上
(文件的形式存放),超过指定时间,浏览器会销毁该cookie。
当seconds < 0时,默认值(即保存在内存里面)。
当seconds = 0时,删除cookie。
比如,要删除一个名称为username的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
7)cookie的路径问题
a.浏览器访问服务器时,会比较cookie的路径是否与
要访问的路径匹配,只有匹配的cookie才会被发送。
b.cookie的默认路径
默认等于添加该cookie的web组件的路径。
比如 /servlet-day06/biz01/addCookie.jsp添加了
一个cookie,则该cookie的默认路径就是
/servlet-day06/biz01
我有个疑问: 就是添加cookie的web组件是com.zj.web.CheckcodeServlet,那这个cookie的默认路径是什么?我试了一下,用getPath()方法的得到的路径是null?
没弄明白。从浏览器发给服务器的cookie里只有cookie的名称和值,没有cookie的路径。
解决:就算你不设置Cookie的path,Cookie也是有路径的。这个路径就是请求的路径。例如在请求http://localhost/day07_03/AServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/。
例如请求的路径是http://localhost/day07_03/servlet/BServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/servlet/。
---------------------
作者:李昆鹏
来源:CSDN
原文:https://blog.csdn.net/weixin_41547486/article/details/81294238
版权声明:本文为博主原创文章,转载请附上博文链接!
c.匹配规则
要访问的路径必须等于cookie的路径或者是其子路径,
符合该要求的cookie才会被发送出去。
比如,cookie的路径是 /servlet-day06/biz01,
则:
/servlet-day06/findCookie1.jsp 不会
/servlet-day06/biz01/findCookie2.jsp 会
/servlet-day06/biz01/sub/findCookie3.jsp 会
d.cookie.setPath(String path)
注:该方法用于设置cookie的路径
8)cookie的限制
a.可以被用户禁止。
b.只能保存少量的数据(大约4k左右)。
c.保存的数量也有限制(大约几百个)。
d.只能保存字符串,对于中文,需要编码。
e.不安全。
## 今天终于验证了cookie的生存时间问题,一直纠结于cookie是在关闭浏览器窗口还是关闭整个浏览器,cookie会销毁?验证的结果是关闭那一个浏览器窗口是不会销毁cookie的,必须要关闭整个浏览器,cookie才会销毁。
2. Session(会话)
## (1)什么是Session?
服务器端为保存状态而创建的一个特殊的对象。
## (2)工作原理
//默认以cookie的方式发送是啥意思??
浏览器访问服务器时,服务器会创建一个session对象(该对象
有一个唯一的id,一般称之为sessionId),服务器会将这个
sessionId发送给浏览器(默认以cookie的方式发送),浏览器
会将sessionId保存下来(保存在内存);当浏览器再次访问
服务器时,会将sessionId发送给服务器,服务器依据sessionId
找到对应的session对象。
![](session.png)
## (3)获取session对象
1)HttpSession s =
request.getSession(boolean flag);
a.flag为true时
先查看请求当中有没有sessionId,如果没有,则创建
session对象;如果有sessionId,则依据该sessionId
去查找对应的session对象(如果找到了,则返回,找不到,
则创建一个新的session对象)。
b.flag为false时
先查看请求当中有没有sessionId,如果没有,返回null;
如果有sessionId,则依据该sessionId
去查找对应的session对象(如果找到了,则返回,找不到,
返回null)。
2)HttpSession s =
request.getSession();
等价于request.getSession(true);
## (4)绑订数据相关的几个方法
session.setAttribute(String name,Object obj)
Object session.getAttribute(String name);
removeAttribute(String name);
## (5)session超时
1)什么是session超时
服务器会将空间时间过长的session对象删除掉。
注:默认的超时时间限制是30分钟。
可以修改服务器缺省的超时时间限制
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2)session.setMaxInactiveInterval(int seconds)
## (6)删除session
session.invalidate()
# 3. session验证
step1.登录成功之后,在session对象上绑订一些数据,比如
session.setAttribute("user",user);
step2.当用户访问需要保护的资源的时候(只有登录成功才能访问的资源) Object obj = session.getAttribute("user");
if(obj == null){
//没有登录
response.sendRedirect("login.jsp");
}
# 4. 验证码(扩展)
![](checkcode.png)
练习: 生成一个长度固定为5个字符,并且这些字符要求从
(A~Z,0~9)中选取,比如 X09BD