什么是状态管理?
将浏览器与web服务器的多次交互当作一个整体来处理,将多次交互所涉及的数据状态保存下来。
管理方式1:将状态保存在浏览器,需要使用cookie技术
管理方式2:将状态保存在服务器,需要使用session技术
***什么是cookie?
服务器存放在浏览器端的少量数据。
cookie:
cookie是一种客户端的状态管理技术。
当浏览器访问服务器时,服务器会将一些信息以set_cookie消息头的形式发送给浏览器,浏览器会将这些数据保存下来,当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式一并发送给服务器。(有几个cookie,就有几个消息头)。
添加cookie的方法:
Cookie cookie = new Cookie(String name,String value);cookie的名字和值为String 类型
response.addCookie(cookie);
查询cookie的方法:
Cookie[ ] cookies = request.getCookies();
for( Cookie cookie : cookies){
String name = cookie.getName();//返回查询到的cookie的name
String value = cookie.getValue();//返回cookie的值
}
cookie的生存时间:
默认情况下,cookie会被浏览器保存在内存里面,浏览器只要不关闭,cookie就一直存在。
Cookie cookie = new Cookie("name" , "value");
// Sets the maximum age in seconds for this Cookie.
cookie.setMaxAge(int seconds);
当 seconds > 0 时,浏览器会将cookie保存在硬盘上,超过seconds时间后会删除cookie。
当 seconds < 0 时,默认为小于0,cookie会保存在内存中。
当 seconds = 0 时,删除当前cookie;
例如:要删除当前名为 name 的cookie,
Cookie cookie = new Cookie("name","");
cookie.setMaxAge(0);
response.addCookie(cookie);
cookie 的编码问题:
cookie 只能保存合法的ASCII编码 ,如果要保存中文,需要将中文转换成相应的ASCII字符的形式。
URLEncoder.encode(String str, String charset);
URLDecoder.decode(String str, String charset);
//URLEncoder.encode(URLDecoder.decode(String str, String charset), String charset);
cookie 的路径问题:
1、当浏览器向服务器上的某个地址发送请求时,会比较该地址是否符合cookie的路径的要求,只有符合的cookie才会发送给服务器。
2、cookie 的默认路径为添加该cookie 的web 组件的路径
3、cookie 的路径匹配规则:
要访问的地址必须等于cookie 的路径或者是其子路径。
4、cookie 的路径修改:
//调用setPath()来设置cookie的路径
cookie.setPath(url);
5、cookie 的限制
1)cookie 可以被用户禁止;
2)cookie 不安全,所以,对于敏感数据一定要加密处理;
3)cookie 只能保存少量的数据,总量大约为 2K;
4)cookie 的数量有限制,总量约为几百个(某些网站为几十个);
5)cookie 只能保存字符串。
***session 会话
什么是session?
服务端为了维护保存状态而创建的特殊对象。
session的工作原理:
如何获取session对象?
保存状态的方法:
setAttribute(String name, Object obj);
Object getAttribute(String name);
removeAttribute(String name);
session超时:
服务器会将空闲时间过长的session对象删除掉,这样可以节省内存空间(session的空闲时间一般为30m)。
设置session超时时间:
方式一:在Servers内设置超时时间(单位:minutes):(相对于全局)
方式二:在Maven项目的描述文件内设置超时时间(单位:minutes):(相对于当前项目)
方式三:在Servlet里面调用 setMaxInactiveInterval() 设置超时时间(单位:seconds):(相对于容器内当前servlet)
设置超时时间的优先级:方式三 > 方式二 > 方式一
删除session:
session 验证:
step1:登陆成功之后,将一些数据绑定到session对象上。
session.setAttribute("user", user);
step2:如何请求涉及到需要保护的资源(只有登陆成功后才能访问的资源,比如用户列表),则进行session认证。
Object obj = session.getAttribute("user");
if(obj == null){
response.sendRedirect("login.jsp");
}
比较cookie 与 session 的优缺点:
cookie 优点: 不占用服务器的内存资源。
session 的优点: 安全,且可以保存更丰富的数据类型。
session 的缺点:可能会占用过多的内存空间,多台服务器负载均衡,session 同步。