状态管理
1.什么是状态管理
将浏览器与web服务器之间多次交互当作一个整体来处理并且将多次交互的所涉及的数据(状态)保存下来;
2.如何进行状态管理
a.Cookie技术
将少量数据(状态)保存在浏览器端
b.Session技术
将数据(状态)保存在服务端(数据共享)
3.什么是Cookie
服务器临时存放在浏览器的少量数据,将这些数据用来跟踪用户的状态;
3.1Cookie的工作原理
当浏览器访问服务器时,服务器将少量的数据以set-cookie的形式发送给浏览器,浏览器会将这些数据保存下来,当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式发送给服务端。
3.2代码演示
1.web.xml配置文件
<servlet>
<description></description>
<display-name>AddCookieServlet</display-name>
<servlet-name>AddCookieServlet</servlet-name>
<servlet-class>web.AddCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddCookieServlet</servlet-name>
<url-pattern>/AddCookie</url-pattern>
</servlet-mapping>
2.Servlet业务层(添加Cookie)
package web;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset=utf-8");
//创建Cookie对象
Cookie c=new Cookie("name", "admin");
//响应Cookie
res.addCookie(c);
/*
* Cookie生存时间问题:
* 1.默认情况下,浏览器会把cookie保存在内存里面,浏览器只要不关闭,cookie所保存的数据会一值存在,
* 浏览器关闭则cookie所保存的数据被删除
* 2.可以调用setMaxAge()方法来设置cookie的生存时间
*/
Cookie c2=new Cookie("age","20");
//设置cookie的生存时间
c2.setMaxAge(20);
res.addCookie(c2);
/*
* URLEncoder可以将普通的字符串转换为application/x-www.form-urlencoded字符串
*/
String str="超超";
str=URLEncoder.encode(str,"utf-8");
Cookie c3=new Cookie("nick",str);
res.addCookie(c3);
}
}
3.执行结果
在浏览器访问服务器时,输入地址,回车后可以看到响应头中有这些数据,服务器将这些数据以set-Cookie的方式返回给了浏览器。
4.xml配置文件
<servlet>
<description></description>
<display-name>findCookieServlet</display-name>
<servlet-name>findCookieServlet</servlet-name>
<servlet-class>web.findCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>findCookieServlet</servlet-name>
<url-pattern>/findCookie</url-pattern>
</servlet-mapping>
5.Servlet(业务层)
查找浏览器在Cookie所保存的数据
public class findCookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//设置响应类型
res.setContentType("text/html;charset=utf-8");
PrintWriter pw=res.getWriter();
Cookie[] cs=req.getCookies();
if(cs!=null){
for(Cookie c:cs){
String name=c.getName();
String value=c.getValue();
//解码
/*
* URLDecoder类包含了一个静态方法decode(string str,string charset),
* 它可以将%x..乱码转换为自定义编码的字符串
*/
value=URLDecoder.decode(value,"utf-8");
pw.println(name+","+value);
}
}else{
pw.println("没有cookie保存的值");
}
}
}
6.执行结果


其中年龄不见了,是因为年龄Cookie的生命周期过了,浏览器再次访问服务器时,浏览器会将这些数据以cookie消息头的形式发送给服务端。
7.关闭浏览器再次去查找cookie数据时


3.3Cookie的限制
a.可以被用户限制
b.不安全,(对于敏感的数据不建议保存在cookie中,如果一定要保存,需要加密)
c.只能保存少量的数据大概4k,只能保存几百个左右的cookie
d.只能保存字符串
4.什么是Session
服务器为了保存用户状态而创建的一个特殊的对象,它在服务器中;
4.1Session的工作原理
当浏览器访问服务器时,服务器创建session对象(该对象有一个唯一的sessionId),服务器会将sessionId以set-cookie的形式发送给浏览器,当浏览器再次访问服务器时,会将在消息头以cookie形式保存的sessionId发送给服务器,服务器利用发送过来的sessionId找到对应的session对象;
4.2Session的作用
将服务器中的数据进行共享。
1.Servlet业务层
public class someServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//获取session对象
HttpSession session=req.getSession();
//通过session对象获取sessionId
String sessionId=session.getId();
System.out.println(sessionId);
//利用session绑定数据
session.setAttribute("name","超超");
//根据session绑定名获取session绑定的值
Object obj=session.getAttribute("name");
System.out.println(obj);
//重定向
res.sendRedirect(req.getContextPath()+"/a.jsp");
}
}
2.a.jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<% String name=(String)session.getAttribute("name"); %>
<% out.print(name); %>
</body>
</html>
3.执行结果


4.第二次访问

第二次访问a.jsp时,浏览器将以cookie形式保存的sessionid发送给服务器,服务器收到后,查找sessionid对应的session对象。
5. Session超时
服务器会将空闲的时间过长的session对象删除掉,这样做的目的是为了节省内存空间,默认session时间长度是30分钟(在servers文件的Tomcat/server.xml/579行)