tomcat源码解读六 tomcat中的session生命历程

     session的作用是在一次会话中(从打开浏览器到关闭浏览器同当前服务器的交流)当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器根据当前sessionId找到对应的session实例。

1.1 UML关系图

这里写图片描述

1.2 Session的获取api
     session的创建与tomcat请求没有什么很大的直接关系,主要是在进行servlet处理(jsp最终也是被编译成servlet)来获取,获取方式如下:

/获取此次会话的session
//如果参数为true表明当没有获取到对应的session实例会自己创建一个,且默认为真
HttpSession session = request.getSession(true);
HttpSession session1 = request.getSession();
//如果参数为false表明当没有获取到对应的session实例则会返回空
HttpSession session2 = request.getSession(false);

1.3 sessionId的获取
     这里是在request请求已经解析了头部的情况下,根据配置文件获取相应的参数最终得到sessionId的值,这个值得优先级是URL>cookie 最终这个值将会注册到request属性中去

/**
 * 这段代码的意义:向request中注入requestedSessionId并设置其是来与URL Cookie 还是SSL
 *              具体判断是通过requestedSessionURL和requestedSessionSSL这些布尔类型
 *              另一个作用是在下文的重定向过程决定是否需要将sessionCookieName给加入进去以;XXX=XXXXXX形式
 * 在域名泛解析过程中针对访问不同的二级域名,sessionId是默认不共享的
 * */
String sessionID;
if (request.getServletContext().getEffectiveSessionTrackingModes().contains(SessionTrackingMode.URL)) {
    //根据当前sessionCookieName从request的参数中获取相应sessionId,
    sessionID = request.getPathParameter(SessionConfig.getSessionUriParamName(request.getContext()));
    //如果sessionId不为空,将其注入request的requestedSessionId属性
    if (sessionID != null) {
        request.setRequestedSessionId(sessionID);
        //获取解析到说明请求是从URL中解析出来
        request.setRequestedSessionURL(true);
    }
}
//在cookies和SSL中寻找sessionId,如果requestedSessionId不存在,则直接注入
parseSessionCookiesId(request);
parseSessionSslId(request);
sessionID = request.getRequestedSessionId();

     这里会有个问题,在URL中都是以k,v的形式存在,那么这个k是来自于哪个地方,一下代码展示:

 * 获取配置的sessionCookieName
 * 第一种是配置Web应用的时候 Context标签下
 * 1 <Context path='' docBase='ROOT' sessionCookieP
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值