Cookie特点:
1)会话数据放在浏览器端
2)数据类型只能string,而且有大小限制的
3)相对数据存放不安全。
Session特点:
1)会话数据放在服务器端(服务器内存),占用服务器资源
2)数据类型任意类型,没有大小限制的。
3)相对安全
Session使用步骤
HttpSession对象:
1)创建HttpSession对象,用于保存会话数据
session= request.getSession(); 创建或获取session对象
2)修改HttpSession对象
voidsetMaxInactiveInterval(int interval) 设置session对象的有效时间
voidinvalidate() 手动销毁session对象
3)保存会话数据(作为域对象)
session.setAttribute("name",Object); 保存数据
session.getAttribute("name") 获取数据
session.removeAttribute("name")删除数据
Session原理
问题:服务器怎么区分不同的浏览器会话?
前提: 可以从session对象取出数据必须是存放数据的sessinon对象!!!
1)浏览器1-窗口1(001):
//1)创建HttpSession对象
HttpSession session =request.getSession(); 给session对象分配001
//2)保存会话数据
session.setAttribute("name","jacky");
2)浏览器1-窗口2(001):
//1)得到session对象
HttpSession session =request.getSession(); 搜索001的session对象
//2)获取会话数据
String name = (String)session.getAttribute("name"); 可以得到!!
3)浏览器2(没有标记或不是001)
//1)得到session对象
HttpSession session =request.getSession();
//2)获取会话数据
String name = (String)session.getAttribute("name"); 不可以得到!
4)新的浏览器1(没有标记或不是001)
//1)得到session对象
HttpSession session =request.getSession();
//2)获取会话数据
String name = (String)session.getAttribute("name"); 不可以得到!!
1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID
2)把JSESSIONID作为Cookie发送给浏览器
3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器
4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象,
5)如果找到,则返回这个session对象
6)如果找不到,可能直接返回null,或者再创建新的session对象。
HttpSessionsession = request.getSession();
结论:通过JSESSIONID在服务器中查询对应的session对象。
Session细节
1)setMaxInactiveInterval(秒数): 设置session对象的有效时间
问题:session在什么销毁?
注意:不是浏览器关闭,session对象就销毁!!!
默认情况:等待30分钟空闲时间,session对象才会销毁。
<!-- 设置全局的session对象的过期时间(分钟),在xml文件中设置--> <session-config> <session-timeout>1</session-timeout> </session-config> |
2)可以让JSESSIONID不会随着浏览器关闭而丢失!!!!
/** * 设置JSESSIONID的时间,不会随着浏览器关闭而丢失! */ Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(1*30*24*60*60);//1个月 response.addCookie(c); |
|
3)直接手动销毁sessino对象
invalidate();
4) 创建或得到session对象
request.getSession()/ request.getSession(true): 创建或得到session对象,查询session对象,如果没有sessino对象,则 创建新的session对象
request.getSession(false) 得到session对象。 查询session对象,如果session对象,如果没有sessino对象,直接返回null
实例:
创建一个Session,并传入一个值
public class SessionDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 把数据保存到HttpSession对象中
*/
//1)创建HttpSession对象
HttpSession session =
request.getSession(true);
/**
* 设置session的有效时间
*/
//session.setMaxInactiveInterval(20);
/**
* 设置JSESSIONID的时间,不会随着浏览器关闭而丢失!
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(1*30*24*60*60);//1个月
response.addCookie(c);
//2)保存会话数据
session.setAttribute("name", "jacky");
}
}
取出Session对象中的值
public class SessionDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 从HttpSession对象中获取数据
*/
//1)得到session对象
HttpSession session =
request.getSession(false);
if(session==null){
System.out.println("没有session对象");
}else{
//2)获取会话数据
String name =
(String)session.getAttribute("name");
System.out.println("name="+name);
}
}
}
删除Session对象中的值
public class SessionDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1)得到session对象
HttpSession session = request.getSession();
//2)销毁
session.invalidate();
System.out.println("销毁成功");
}
}