Session与Cookie

Cookie

  由于HTTP是一种无状态协议,当用户的一次访问请求结束后,后端服务器就无法知道下一次来访问的还是不是上次访问用户。

  为了解决这种情况,使用Cookie来记录用户在一段时间内访问Web应用的行为路径。

  Cookie中的“NAME=VALUE“”属性用来设置要保存的Key/Value,不同浏览器对Cookie的存储限制不同(大小和数量)。

  在Servlet中,我们通过response.addCookie创建多个Cookie时,每次调用addCookie都会创建一个Header,最终在请求返回时构造的HTTP响应头会将这些合并。

  在tomcat中是这样构造Http响应头的(org.apache.coyote.http11.Http11Processor类的prepareResponse方法):

       

int size = headers.size();
for (int i = 0; i < size; i++) {
  outputBuffer.sendHeader(headers.getName(i), headers.getValue(i));    
}

 

Session 

  Session的三种工作方式:

  • 基于URL Path Parameter,默认支持。
  • 基于Cookie,如果没有修改Context容器的Cookie标识,则也是默认支持的。
  • 基于SSL,默认不支持,只有connector.getAttribute("SSLEnabled)"为TRUE时才支持。

  当浏览器不支持Cookie时,浏览器会将用户名的SessionCookieName重写到用户请求的URL参数中,服务器会从Path Parameters中拿到用户配置的SessionCookieName。如果在web.xml中配置session-config配置项,其cookie-config下的name属性就是SessionCookieName的值。如果没有配置session-config,默认的SessionCookieName就是“JSESSIONID”。

  第二种情况,如果客户端支持Cookie,Cookie中的Session Id会覆盖URL中的Session Id。

  第三种情况,则会根据javax.servlet.request.ssl_session属性值设置Session Id。

  与Cookie不同的是Session保存在服务端,与Session关联的Cookie与其它Cookie没什么不同。

 

posted @ 2017-11-16 13:47  leiqjl  阅读(189)  评论(0编辑  收藏  举报