Cookie和Session

Cookie:分为浏览器Cookie和硬盘Cookie

•Cookie的英文原意是“点心”,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的“点心”。
•服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用。

•一个Cookie包含一对Key/Value。下面的代码生成一个Cookie并将它写到用户的硬盘上:
Cookie theCookie=new Cookie("cookieName","cookieValue");
response.addCookie(the Cookie);

上面这样调用只是浏览器的Cookie,如果要让他成为硬盘Cookie,即写硬盘上去,就要theCookie.setMaxAge()方法进行设置

注意:一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的 servlet/jsp读到,其他路径无法读取到

 

Session:

Session是放在服务器端的,在服务器端建立一块内存,发给客户端的是这个session的Id

Session用于跟踪客户的状态。Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。

Session的运行机制:

•当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)。
•Servlet容器为HttpSession分配一个惟一标志符,称为Session ID。Servlet容器把Session ID作为Cookie保存在客户的浏览器中。
•每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSession对象,从而获取客户的状态信息。

session原理图:

Session的生命周期:

•当客户第一次访问Web应用中支持Session的某个网页时,就会开始一个新的Session。
•接下来当客户浏览这个Web应用的不同网页时,始终处于同一个Session中。
•默认情况下,JSP网页都是支持Session的,也可以通过以下语句显式声明支持Session:
<%@ page session= "true">

•在以下情况中,Session将结束生命周期,Servlet容器会将Session所占用的资源释放掉:
–客户端关闭浏览器(真的这样吗?),实际上保存在服务端的session此时并未被销毁,只有等到过了一段时间之后,即超时了,才会被销毁,只是客户端关闭了浏览器之后,保存在浏览器端的进程中的sessionId随着也被销毁了,当下一次启动浏览器访问服务端的时候就不能再把上次的那个sessionId传过去了.
–Session过期
–服务器端调用了HttpSession的invalidate()方法

 

如何做到在浏览器关闭时删除session

•严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。
•但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
•实际上在项目中我们也不会这么做,而是让服务器在Session过期时将其删除

 

session过期:

•Session过期是指当Session开始后,在一段时间内客户没有和Web服务器交互,这个Session会失效,HttpSession的setMaxInactiveInterval()方法可以设置允许Session保持不活动状态的时间(以秒为单位),如果超过这一时间,Session就会失效。

 

 

session和cookie的关系:

Cookie:安全性是没问题的,他是不能跨域访问的,即不能这个服务器访问另外一个服务器所提供的cookie,浏览器是允许这样做的.并且是加密的.

Cookie有两种,一种是可以保存在硬盘上的,一个是保存在浏览器的进程当中的,其实session也叫会话cookie,就是属于后一种的cookie

 

 

如何在禁用 Cookie 的浏览器中使用 Session

JavaServletAPI中引用Session机制来追踪客户的状态。ServletAPI中定义了javax.servlet.http.HttpSession接口,Servlet容器必须实现这个接口。当一个Session开始时,Servlet容器将创建一个HttpSession对象,Servlet容器为HttpSession分配一个唯一标识符,称为SessionID。Servlet容器将SessionID作为Cookie保存在客户的浏览器中。每次客户发出HTTP请求时,Servlet容器可以从HttpRequest对象中读取SessionID,然后根据 SessionID找到相应的HttpSession对象,从而获取客户的状态信息。

当客户端浏览器中禁止Cookie,Servlet容器无法从客户端浏览器中取得作为Cookie的SessionID,也就无法跟踪客户状态。

JavaServletAPI中提出了跟踪Session 的另一种机制,如果客户端浏览器不支持Cookie,Servlet容器可以重写客户请求的URL,把SessionID添加到URL信息中。

HttpServletResponse接口提供了重写URL的方法:public java.lang.StringencodeURL(java.lang.Stringurl)

该方法的实现机制为:
●先判断当前的Web组件是否启用Session,如果没有启用Session,直接返回参数url。
●再判断客户端浏览器是否支持Cookie,如果支持Cookie,直接返回参数url;如果不支持Cookie,就在参数url中加入SessionID信息,然后返回修改后的url。如这样:http://localhost:8080/drpservlet/SetCookie?sessionId=XXX http://www.mscto.com

我们可以对网页中的链接稍作修改,解决以上问题:
修改前:
<ahref=“maillogin.JSP“>
修改后:
<ahref=“<%=response.encodeURL(“maillogin.jsp“)%>“>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjsuge

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值