session的详情和cookie的不足

问题1)cookie的不足,为什么会有session

1)cookie会话,只能发送字符串。(很多时候我们需要传递对象。)

2)一个Cookie最大是4kb

3)Cookie数据内容只能是英文。

 

问题2session的工作原理和cookie的对比?

1Cookie是将数据发送到浏览器保存。

   Session会话数据保存在服务器,浏览器发送jsessionid到服务器,获得数据。

2Session技术用到了cookie技术。

sessioncookie只是多了一个步骤,session中用cookie存储的是id,而不是实际数据)

 

问题3session的对象创建过程?

HttpSession session = request.getSession();

1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

new HttpSession();

2)把JSESSIONID作为Cookie的值发送给浏览器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)浏览器带着JSESSIONIDcookie访问服务器

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对象的时候。

 

问题4request.getSession()方法都做了哪些事情

如果session对象存在,就将session对象取出来

1)浏览器用http协议发送request,带着Jsessionidcookie

2)服务起根据cookiejsessionid,在服务器内存中搜索是否存在对应的session对象。

3)返回找到的session对象。

如果session对象不存在,就创建session对象

1)浏览器第一个访问服务器,创建session对象分配唯一的id

2)jsessionid放到cookie当中发送给浏览器保存。

3)返回创建的session对象。

 

 

问题5httpsession用到的api

HttpSession类:用于保存会话数据

 

1)创建或得到session对象

HttpSession getSession()   //没有session对象会创建。

HttpSession getSession(boolean create)  //FALSE没有session对象会返回 nullTRUE和无参数的构造方法相同。

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) 清除数据

 

问题6api的方法解读

1)如果希望只是获得session对象参数是FALSE

//没有session对象会创建。

HttpSession getSession()  

//FALSE没有session对象会返回nullTRUE和无参数的构造方法相同。

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>

方法3void setMaxInactiveInterval(int interval) 单位是秒。

 

3) 手动销毁session对象?

 void

invalidate() 

4设置cookie中Jsessionid的有效时间?

Cookie cook = new Cookie("JSESSIONID",session.getId());

cook.setMaxAge(60*60);

response.addCookie(cook);

 

问题6session中用的cookie的会话有效路径和有效时间是什么?

有效时间(cookie存在的时间):Session中默认的cookie存储的jsessionid,关闭浏览器自动删除。

有效路径(发送cookie的值到该路径下):默认是当前项目下。

 

7)为什么登陆功能用session?不用cookierequest域对象和context

 

 * 方法1,context域对象:不合适,同名的会被覆盖。

 * 方法2,request域对象:不合适,(request只有转发数据的两个Servlet,也可 以传递给其他Servlet,但是每次都要指定发送给哪个Servlet)

 * 例子:

发送端:

发送数据到indexServlet,urlindex。

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");

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值