博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jetty对sessionId的处理分析
阅读量:4668 次
发布时间:2019-06-09

本文共 8996 字,大约阅读时间需要 29 分钟。

jetty7对sessionId的处理,首先入口在SessionHandler.java的doScope方法,jetty的源码分析可以参考这篇

/* ------------------------------------------------------------ */    /*     * @see org.eclipse.jetty.server.Handler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int)     */    @Override    public void doScope(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)            throws IOException, ServletException    {        setRequestedId(baseRequest,request);        SessionManager old_session_manager=null;        HttpSession old_session=null;        try        {            old_session_manager = baseRequest.getSessionManager();            old_session = baseRequest.getSession(false);            if (old_session_manager != _sessionManager)            {                // new session context                baseRequest.setSessionManager(_sessionManager);                baseRequest.setSession(null);            }            // access any existing session            HttpSession session=null;            if (_sessionManager!=null)            {                session=baseRequest.getSession(false);                if (session!=null)                {                    if(session!=old_session)                    {                        HttpCookie cookie = _sessionManager.access(session,request.isSecure());                        if (cookie!=null ) // Handle changed ID or max-age refresh                            baseRequest.getResponse().addCookie(cookie);                    }                }                else                {                    session=baseRequest.recoverNewSession(_sessionManager);                    if (session!=null)                        baseRequest.setSession(session);                }            }            if(Log.isDebugEnabled())            {                Log.debug("sessionManager="+_sessionManager);                Log.debug("session="+session);            }            // start manual inline of nextScope(target,baseRequest,request,response);            if (_nextScope!=null)                _nextScope.doScope(target,baseRequest,request, response);            else if (_outerScope!=null)                _outerScope.doHandle(target,baseRequest,request, response);            else                 doHandle(target,baseRequest,request, response);            // end manual inline (pathentic attempt to reduce stack depth)                    }        finally        {            HttpSession session=request.getSession(false);            if (old_session_manager != _sessionManager)            {                //leaving context, free up the session                if (session!=null)                    _sessionManager.complete(session);                                // Leave last session in place                if (old_session_manager!=null )                {                    baseRequest.setSessionManager(old_session_manager);                    baseRequest.setSession(old_session);                }            }        }    }
setRequestedId(baseRequest,request); 就是从request请求中获取sessionId的过程,首先是从cookie中获取,获取不到再从url中获取,是否设置useCookie,也可以通过配置文件配置

/* ------------------------------------------------------------ */    /** Look for a requested session ID in cookies and URI parameters     * @param baseRequest     * @param request     */    protected void setRequestedId(Request baseRequest, HttpServletRequest request)    {        String requested_session_id=request.getRequestedSessionId();        if (!DispatcherType.REQUEST.equals(baseRequest.getDispatcherType()) || requested_session_id!=null)            return;        SessionManager sessionManager = getSessionManager();        boolean requested_session_id_from_cookie=false;        HttpSession session=null;        // Look for session id cookie        if (_sessionManager.isUsingCookies())        {            Cookie[] cookies=request.getCookies();            if (cookies!=null && cookies.length>0)            {                for (int i=0;i
=0) { s+=prefix.length(); int i=s; while (i
 sessionId的默认参数名为:JSESSIONID

/**     * @return the session cookie name, by default "JSESSIONID".     * @see #setSessionCookie(String)     */    public String getSessionCookie();    /**     * @return a formatted version of {@link #getSessionIdPathParameterName()}, by default     *         ";" + sessionIdParameterName + "=", for easier lookup in URL strings.     * @see #getSessionIdPathParameterName()     */    public String getSessionIdPathParameterNamePrefix();
而如果sessionId不存在,同样也是在request.getSession的时候才生成session,并且把sessionId的信息存入cookjie中

package org.eclipse.jetty.server;public class Request implements HttpServletRequest{...... /* ------------------------------------------------------------ */    /*      * @see javax.servlet.http.HttpServletRequest#getSession()     */    public HttpSession getSession()    {        return getSession(true);    }    /* ------------------------------------------------------------ */    /*      * @see javax.servlet.http.HttpServletRequest#getSession(boolean)     */    public HttpSession getSession(boolean create)    {        if (_sessionManager==null && create)            throw new IllegalStateException("No SessionManager");                if (_session != null && _sessionManager!=null && _sessionManager.isValid(_session))            return _session;                _session=null;                String id=getRequestedSessionId();                if (id != null && _sessionManager!=null)        {            _session=_sessionManager.getHttpSession(id);            if (_session == null && !create)                return null;        }                if (_session == null && _sessionManager!=null && create )        {            _session=_sessionManager.newHttpSession(this);            HttpCookie cookie=_sessionManager.getSessionCookie(_session,getContextPath(),isSecure());            if (cookie!=null)                _connection.getResponse().addCookie(cookie);        }                return _session;    }......}
我们再看下如果session不存在,则会通过_sessionManager.newHttpSession(this);创建一个,创建过程如下:

/* ------------------------------------------------------------ */    /**     * Create a new HttpSession for a request     */    public HttpSession newHttpSession(HttpServletRequest request)    {        Session session=newSession(request);        session.setMaxInactiveInterval(_dftMaxIdleSecs);        addSession(session,true);        return session;    }  /* ------------------------------------------------------------ */  //HashSessionManager的实现    @Override    protected AbstractSessionManager.Session newSession(HttpServletRequest request)    {        return new HashedSession(request);    }/**         * Session from a request.         *          * @param request         *///JDBCSESSIONManager的实现        protected Session (HttpServletRequest request)        {            super(request);               _data = new SessionData(_clusterId,_attributes);            if (_dftMaxIdleSecs>0)                _data.setMaxIdleMs(_dftMaxIdleSecs*1000);            _data.setCanonicalContext(canonicalize(_context.getContextPath()));            _data.setVirtualHost(getVirtualHost(_context));            _data.setExpiryTime(_maxIdleMs < 0 ? 0 : (System.currentTimeMillis() + _maxIdleMs));        }
而通过request创建对应SESSIONID的,sessionId分为两部分:clusterId和nodeId, nodeId就是SESSIONID

protected Session(HttpServletRequest request)        {            _newSession=true;            _created=System.currentTimeMillis();            _clusterId=_sessionIdManager.newSessionId(request,_created);            _nodeId=_sessionIdManager.getNodeId(_clusterId,request);            _accessed=_created;            _lastAccessed=_created;            _requests=1;            Log.debug("new session & id "+_nodeId+" "+_clusterId);        }
JDBC的getNodeId
/**      * Get the session id, including this node's id as a suffix.     *      * @see org.eclipse.jetty.server.SessionIdManager#getNodeId(java.lang.String, javax.servlet.http.HttpServletRequest)     */    public String getNodeId(String clusterId, HttpServletRequest request)    {        if (_workerName!=null)            return clusterId+'.'+_workerName;        return clusterId;    }
Hash的getNodeId

/* ------------------------------------------------------------ */    /** Get the session ID with any worker ID.     *      * @param clusterId     * @param request     * @return sessionId plus any worker ID.     */    public String getNodeId(String clusterId,HttpServletRequest request)     {        // used in Ajp13Parser        String worker=request==null?null:(String)request.getAttribute("org.eclipse.jetty.ajp.JVMRoute");        if (worker!=null)             return clusterId+'.'+worker;                 if (_workerName!=null)             return clusterId+'.'+_workerName;               return clusterId;    }
jetty是做好了集群sessionId生成的配置。

转载于:https://www.cnblogs.com/zhwj184/archive/2012/07/29/3027479.html

你可能感兴趣的文章
java语言程序设计(基础篇) 第2章 基本程序设计 课本源代码
查看>>
装饰者模式 详解
查看>>
【模板】卢卡斯定理
查看>>
[POJ 1273]Drainage Ditches
查看>>
[CODEVS 1036]商务旅行
查看>>
编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
查看>>
MySQL安装与操作总结
查看>>
python 中time, datetime的用法
查看>>
python中将函数赋值给变量时需要注意的一些问题
查看>>
SAS数据挖掘实战篇【五】
查看>>
如何成为合格的数据分析师
查看>>
ArcGIS10.5资源分享
查看>>
理解http幂等性
查看>>
grep运用
查看>>
logstash收集syslog日志
查看>>
jenkins修改数据存放路径
查看>>
poj2481树状数组解二维偏序
查看>>
软件工程网络15个人阅读作业1(201521123062 杨钧宇)
查看>>
根据控制点坐标对完成坐标转换
查看>>
Boost.ASIO简要分析-4 多线程
查看>>