问题1)cookie的不足,为什么会有session?
1)cookie会话,只能发送字符串。(很多时候我们需要传递对象。)
2)一个Cookie最大是4kb
3)Cookie数据内容只能是英文。
问题2)session的工作原理和cookie的对比?
1,Cookie是将数据发送到浏览器保存。
Session会话数据保存在服务器,浏览器发送jsessionid到服务器,获得数据。
2,Session技术用到了cookie技术。
(session比cookie只是多了一个步骤,session中用cookie存储的是id,而不是实际数据)
问题3)session的对象创建过程?
HttpSession session = request.getSession();
1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
new HttpSession();
2)把JSESSIONID作为Cookie的值发送给浏览器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)浏览器带着JSESSIONID的cookie访问服务器
4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
if(找到){
return map.get(sessionID);
}
Map<String,HttpSession>]
<"s001", s1>
<"s001,"s2>
5)如果找到对应编号的session对象,直接返回该对象
6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
注意:前三步就是cookie的工作原理。5,6步是没有找到session对象的时候。
问题4)request.getSession()方法都做了哪些事情?
如果session对象存在,就将session对象取出来
1)浏览器用http协议发送request,带着Jsessionid的cookie。
2)服务起根据cookie中 jsessionid,在服务器内存中搜索是否存在对应的session对象。
3)返回找到的session对象。
如果session对象不存在,就创建session对象
1)浏览器第一个访问服务器,创建session对象分配唯一的id。
2)把jsessionid放到cookie当中发送给浏览器保存。
3)返回创建的session对象。
问题5)httpsession用到的api
HttpSession类:用于保存会话数据
1)创建或得到session对象
HttpSession getSession() //没有session对象会创建。
HttpSession getSession(boolean create) //FALSE没有session对象会返回 null,TRUE和无参数的构造方法相同。
2)设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
3)保存会话数据到session对象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据
java.lang.Object getAttribute(java.lang.String name) : 获取数据
void removeAttribute(java.lang.String name) : 清除数据
问题6)api的方法解读
1)如果希望只是获得session对象参数是FALSE。
//没有session对象会创建。
HttpSession getSession()
//FALSE没有session对象会返回null,TRUE和无参数的构造方法相同。
HttpSession getSession(boolean create)
2) 设置session对象的有效时间?方法void setMaxInactiveInterval(int interval)
为什么会有session对象的有效时间呢?
因为关闭浏览器只能删除cookie中的jsessionid,而不能销毁服务器内存中的对象,所 以需要设置session对象的有效时间。
方法1),默认请求下,session对象在服务器内存中保存30分钟。
方法2) 通过setMaxInactiveInterval()方法只能设置一个session对象的有效时间,如何设置所有的session对象的有效时间呢?
通过web.xml文件:单位是分钟。
<session-config> <session-timeout>1</session-timeout> </session-config> |
方法3)void setMaxInactiveInterval(int interval) 。单位是秒。
3) 手动销毁session对象?
void |
4)设置cookie中Jsessionid的有效时间?
Cookie cook = new Cookie("JSESSIONID",session.getId());
cook.setMaxAge(60*60);
response.addCookie(cook);
问题6)session中用的cookie的会话有效路径和有效时间是什么?
有效时间(cookie存在的时间):Session中默认的cookie存储的jsessionid,关闭浏览器自动删除。
有效路径(发送cookie的值到该路径下):默认是当前项目下。
7)为什么登陆功能用session?不用cookie,request域对象和context?
* 方法1,context域对象:不合适,同名的会被覆盖。
* 方法2,request域对象:不合适,(request只有转发数据的两个Servlet,也可 以传递给其他Servlet,但是每次都要指定发送给哪个Servlet)
* 例子:
发送端:
发送数据到indexServlet,url是index。
request.setAttribute("name", username);
request.getRequestDispatcher("/index").forward(request, response);
接收端
接收request域对象数据
String name = (String)request.getAttribute("name");
方法3,例子
发送数据端:
//创建session对象
HttpSession session = request.getSession();
//保存数据到session当中。
session.setAttribute("name",username);
//跳转到用户主页,重定向
response.sendRedirect(request.getContextPath()+"/index");
接收数据端;
// 只取出session数据,不创建session对象。
HttpSession session = request.getSession(false);
//获取session对象数据。
String name = (String)session.getAttribute("name");