.Net转Java自学之路—基础巩固篇二十八(Cookie、Session)

时间:2022-12-13 19:52:56

Cookie:

   Http协议规定:

    1个Cookie最大4kb;1个服务器最多向一个浏览器保存20个Cookie;1个浏览器最多可以保存300个Cookie。

  JavaWeb中使用Cookie:

    原始方式:使用response发送Set-Cookie响应头;使用request获取Cookie请求头

    便捷方式:使用response.addCookie()向浏览器保存Cookie;使用request.getCookie()获取浏览器兑换的Cookie

  Cookie详解:

    Cookie不是只有name和value两个属性。

    maxAge:Cookie的最大生命周期,即Cookie可保存的最大时长。秒为单位。例:cookie.maxAge(60)

      maxAge>0:浏览器会把Cookie保存到客户端硬盘上;有效时长为maxAge值。

      maxAge<0:Cookie只在浏览器内存中存在,关闭浏览器,Cookie移除。

      maxAge=0:浏览器会马上移除这个Cookie

    path:Cookie的path并不是设置这个Cookie在客户端的保存路径。Cookie的path由服务器创建Cookie时设置。

      当浏览器访问服务器某个路径时,是否需要归还Cookie给服务器,则时由Cookie的path来决定。

      当浏览器访问服务器的路径,若包含某个Cookie的路径,那么九会归还这个Cookie。

      Cookie的path默认值:当前访问路径的父路径。

    domain:用来指定Cookie的域名;当多个二级域共享Cookie时才有用。

Session:

  HttpSession概述:

    HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端。

    HttpSession是Servlet三大域对象之一,所以它也有setAttribute()、getAttribute()、removeAttribute()方法。

    三大域:request、session、application(ServletContext)

  作用:

    会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束。

    会话:一个用户对服务器的多次连贯性请求;所谓连贯性请求就是该用户多次请求中间没有关闭的浏览器。

    服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,他们被服务器保存到一个Map中,这个Map被称为session缓存。

    Servlet中得到session对象:HttpSession ses=request.getSession();

    JSP中得到session对象:session是JSP内置对象之一,故、不用创建可直接使用。

  原理:

    request.getSession():获取Cookie中的sessionId

      若sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中。

      若sessionId存在,通过sessionId查找sesion对象,若干没有找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中。

      若sessionId存在,通过sessionId找到了session对象,那么就不会再创建session对象。

      返回session

    若创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,若不关闭浏览器,那么Cookie下次请求时,再次执行request.getSession()时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。

    request.getSession(true)与request.getSession():这俩个方法效果相同。

    request.getSession(false):若session缓存中(如果Cookie不存在),不存在session,那么返回null,而不会创建session对象。

    HttpSession其他方法:

String getId();//获取sessionId
int getMaxInactiveInterval();//获取session的最大不活动时间。默认30分种。
void invalidate();//让session失效。
boolean isNew();//查看session是否为新。

  web.xml中配置session的有效时长:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

  URL重写:

    session依赖Cookie,目的是让客户端发出请求时归还sessionId,这样才能找到对象的session。

    若客户端禁用了Cookie,那么就无法得到sessionId,那么session也就无用了。

    也可以使用URL重写来替代Cookie:response.encodeURL(url);

      该方法会对URL进行只能的重写;当请求中没有归还sessionId这个cookie,那么该方法会重写url,否则不重写。此url必须是本站的url。