Cookie类: 用于管理会话数据的
创建Cookie对象,用于存放会话数据
Cookie c = new Cookie(“name”,”value”)
把cookie发送给浏览器保存
response.addCookie(c);
服务器接收浏览器返回的cookie数据
Cookie[] cs = request.getCookies()
Cookie类的属性:
name: cookie的名称,用于获取cookie
value: cookie的值,用于存储会话数据
path: cookie的存储路径,存储路径决定浏览器是否携带cookie数据访问服务器
默认值:当前web应用路径
maxAge: cookie在浏览器保存的最长时间。默认值为负数
负数:代表cookie保存在浏览器的缓存内存,浏览器关闭cookie丢失!
正数: 代表cookie保存在浏览器的缓存文件,浏览器关闭cookie不会 丢失,而是在到达过期时间才会丢失!
零:代表用于删除同路径同名的cookie
一、关于cookie会话的练习
import java.io.IOException;
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 cookiedemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个cookie对象
Cookie cookie = new Cookie("product","tv");
//修改cookie的路径
cookie.setPath("/xxx");
//修改cookie的缓存时间
cookie.setMaxAge(1*60*60); //缓存一个小时
//发送给浏览器
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
import java.io.IOException;
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 cookiedemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie[] cs = request.getCookies();
if(cs != null){
for(Cookie c : cs){
System.out.println(c.getName() + "==" + c.getValue());
}
}else{
System.out.println("没有缓存");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
二、关于cookie的用户上次访问时间
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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 cookiedemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//格式化时间
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String curtime = simple.format(new Date());
//得到cookie数据
Cookie[] cookies = request.getCookies();
String time = null;
if(cookies != null){
for(Cookie c : cookies){
if(c.getName().equals("time")){
time = c.getValue();
response.getWriter().write("您上次访问的时间" + time);
//更新cookie的时间
c.setValue(curtime);
response.addCookie(c);
}
}
}
//如果是第一次访问则创建cookie
if(cookies == null || time ==null ){
response.getWriter().write("你是首次访问:" + curtime );
Cookie cookie = new Cookie("time",curtime);
response.addCookie(cookie);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
HttpSession开发步骤
HttpSession类:用于保存会话数据的
创建一个HttpSession对象,用来保存数据
HttpSession session =request.getSession()
把会话数据保存到HttpSession对象中
session.setAttribute(“name”,Object);
从HttpSession对象取出会话数据
Object value = session.getAttribute(“name”);
session的管理原理
第一次访问服务器的时候,服务器会为这个浏览器分配一个HttpSession对象,返回一个该HtppSession对象的标记(JSESSIONID)(通过cookie响应头:set=cookie)
浏览器在下次访问服务器的时候,携带这个session标记(JSESSIONID)(通过cookie的请求头:cookie)
session的销毁时机:(关闭浏览器不会销毁HttpSession对象的)
1、默认情况下,30分钟后服务器自动回收( 从最后一次访问开始算 )
2、手动修改session销毁时机:
setMaxInactiveInterval
(int interval)
(单位:秒)
3、全站的所有session销毁时机:
在web.xml中配置一个session-config的数据,以分钟为单位的
4、 直接销毁session: invalidate()
一、关于session的细节
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class sessiondemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String product = request.getParameter("product");
HttpSession session = request.getSession();
System.out.println("session的标记:" + session.getId());
session.setMaxInactiveInterval(20);
session.setAttribute("product", product);
response.getWriter().write(product + "已经加入购物车了<a href='"+request.getContextPath()+"/sessiondemo2'>查看购物车</a>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
二、得到session的对象属性
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class sessiondemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
String product = (String) session.getAttribute("product");
response.getWriter().write("当前购物车有" + product);
session.invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
关于cookie和session的区别:
cookie特点:
1)cookie保存字符串数据
2) 一个cookie数据不能超过4KB,一个web应用不能超过20个cookie,一个浏览器最多300个cookie
3)保存到cookie的数据相对不安全的
session特点:
HttpSession的生命周期:
创建: request.getSession()
销毁:以上四种情况
钝化(序列化):关闭服务器(把内存的HttpSession数据保存到了硬盘)