tomcat(jboss-web)实现所有二级域名共用sessionID

一. 需求.

我们公司要对自己的各个网站进行数据采集,想了解一个用户在我们网站的整个浏览轨迹,但是我们每个二级域名都对应自己的项目,也就是说对应自己的jsessionid,我们无法把这些数据关联起来,所以想到让所有的二级域名都公用一个jsessionid,这样用户的整个浏览数据我们就都能得到了。

二. 开发。

需要对tomcat(jboss-web)的源码进行修改,修改的地方有两处。

1.org.apache.catalina.connector.Request的configureSessionCookie方法

 /**
     * Configures the given JSESSIONID cookie.
     *
     * @param cookie The JSESSIONID cookie to be configured
     */
    protected void configureSessionCookie(TomcatCookie cookie) {
        cookie.setMaxAge(-1);
        if (context.getSessionCookie().getPath() != null) {
            cookie.setPath(context.getSessionCookie().getPath());
        } else {
            String contextPath = context.getEncodedPath();
            if ("".equals(contextPath)) {
                contextPath = "/";
            }
            cookie.setPath(contextPath);
        }
        if (context.getSessionCookie().getComment() != null) {
            cookie.setComment(context.getSessionCookie().getComment());
        }
        if (context.getSessionCookie().getDomain() != null) {
            cookie.setDomain(context.getSessionCookie().getDomain());
        }
        if (context.getSessionCookie().isHttpOnly()) {
            cookie.setHttpOnly(true);
        }
        
        cookie.setPath("/");
        cookie.setDomain(System.getProperty("cookieDomain")); 
        
        if (context.getSessionCookie().isSecure()) {
            cookie.setSecure(true);
        } else if (isSecure()) {
            cookie.setSecure(true);
        }
    }

添加的代码是

cookie.setPath("/");
cookie.setDomain(System.getProperty("cookieDomain"));

2.在编译好的tomcat中修改conf下的catalina.properties

添加cookieDomain变量 cookieDomain=.cdeledu.com

三.原理

tomcat如何读取客户端的jsessionid

向tomcat请求过程中,需要访问org.apache.catalina.connector.CoyoteAdapter的sevice方法,里面调用了postParseRequest方法,这个方法就是主要解析客户端的jsessionid,其中parseSessionId主要是分析url里的jessionID,parseSessionCookiesId这个是分析cookie中的jsessionid

代码如下:

从url获得jsesionid

    /**
     * Parse session id in URL.
     */
    protected void parseSessionId(org.apache.coyote.Request req, Request request) {

        ByteChunk uriBC = req.requestURI().getByteChunk();
        //math的值为:";jsessionid=" ,判断url中是否有这个字符串
        int semicolon = uriBC.indexOf(match, 0, match.length(), 0);
        //如果有解析,并赋值给request(org.apache.catalina.connector.Request)
        if (semicolon > 0) {

            // Parse session ID, and extract it from the decoded request URI
            int start = uriBC.getStart();
            int end = uriBC.getEnd();

            int sessionIdStart = semicolon + match.length();
            int semicolon2 = uriBC.indexOf(‘;‘, sessionIdStart);
            if (semicolon2 >= 0) {
                request.setRequestedSessionId
                    (new String(uriBC.getBuffer(), start + sessionIdStart, 
                            semicolon2 - sessionIdStart));
                // Extract session ID from request URI
                byte[] buf = uriBC.getBuffer();
                for (int i = 0; i < end - start - semicolon2; i++) {
                    buf[start + semicolon + i] 
                        = buf[start + i + semicolon2];
                }
                uriBC.setBytes(buf, start, end - start - semicolon2 + semicolon);
            } else {
                request.setRequestedSessionId
                    (new String(uriBC.getBuffer(), start + sessionIdStart, 
                            (end - start) - sessionIdStart));
                uriBC.setEnd(start + semicolon);
            }
            request.setRequestedSessionURL(true);

        } else {
            request.setRequestedSessionId(null);
            request.setRequestedSessionURL(false);
        }

    }

从cookie中获取

    /**
     * Parse session id in URL.
     */
    protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {

        // Parse session id from cookies 获取request中的cookie
        Cookies serverCookies = req.getCookies();
        int count = serverCookies.getCookieCount();
        if (count <= 0)
            return;

        for (int i = 0; i < count; i++) {
            ServerCookie scookie = serverCookies.getCookie(i);
            //判断cookie中有name为jsessionid的,
            //有就赋值给request(org.apache.catalina.connector.Request)
            if (scookie.getName().equals(Globals.SESSION_COOKIE_NAME)) {
                // Override anything requested in the URL
                if (!request.isRequestedSessionIdFromCookie()) {
                    // Accept only the first session id cookie
                    convertMB(scookie.getValue());
                    request.setRequestedSessionId
                        (scookie.getValue().toString());
                    request.setRequestedSessionCookie(true);
                    request.setRequestedSessionURL(false);
                    if (log.isDebugEnabled())
                        log.debug(" Requested cookie session id is " +
                            request.getRequestedSessionId());
                } else {
                    if (!request.isRequestedSessionIdValid()) {
                        // Replace the session id until one is valid
                        convertMB(scookie.getValue());
                        request.setRequestedSessionId
                            (scookie.getValue().toString());
                    }
                }
            }
        }

    }

由于咱们写到的是主域下,所以在tomcat中能获得这个cookie(tomcat中能获得的cookie的范围为自己域名下和主域下的)。

tomcat(jboss-web)实现所有二级域名共用sessionID

时间: 2024-11-12 22:35:27

tomcat(jboss-web)实现所有二级域名共用sessionID的相关文章

解决tomcat中server.xml设置二级域名 [java.lang.OutOfMemoryError: PermGen space]

<Host name="XXX.XXX.XXX" debug="0" appBase="C:\\JavaWeb\\mytomcatServer\\XXX"  unpackWARs="true" autoDeploy="true"  xmlValidation="false" xmlNamespaceAware="false">  <Alias>

Tomcat,JBoss与JBoss Web

最近接触到应用服务器JBoss,此外JBoss Web与Tomcat也同为web服务器,便查阅资料对三者进行比较,供大家参考. 一.Tomcat Tomcat 服务器是免费开源的Web 应用服务器.支持最新的Servlet 和JSP 规范.因为Tomcat 技术先进.性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器.          Tomcat和IIS.Apache等Web服务器一样,具有处理HTML页面的功能,不过,Tom

tomcat 二级域名 session共享

Tomcat下,不同的二级域名之间或根域与子域之间,Session默认是不共享的,因为Cookie名称为JSESSIONID的Cookie根域是默认是没设置 的,访问不同的二级域名,其Cookie就重新生成,而session就是根据这个Cookie来生成的,所以在不同的二级域名下生成的Session也 不一样.找到了其原因,就可根据这个原因对Tomcat在生成Session时进行相应的修改(注:本文针对Tomcat 6.0.18). 修改tomcat源代码 包:catalina.jar 类:or

windows+tomcat 7配置二级域名访问其他web程序

1.在域名管理中做好二级域名的解析 2.在tomcat的server.xml中增加如下: <Host name="wx.ai77.cn" debug="0" appBase="D:\\webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false&quo

JBoss Web和 Tomcat的区别

JBoss Web和 Tomcat的区别2009-12-14 11:18在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Server.JBoss Web的诸多优越性能,正是其广为流行的原因.

转 : JBoss Web和 Tomcat的区别

JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Server.JBoss Web的诸多优越性能,正是其广为流行的原因. 基于Tomcat内核,青胜于蓝

【转】JBoss Web和 Tomcat的区别

转载于:http://www.verydemo.com/demo_c202_i780.html JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全 球领导者,JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器.在市场占有率和服务满意度上取得了巨大的成功,丝毫不逊色于其它的非开源 竞争对手,如WebSphere.WebLogic.Application Ser

Tomcat Jboss Glassfish 三种常见web容器比较

https://i.cnblogs.com/EditPosts.aspx?postid=7596859 Tomcat Jboss Glassfish 三种常见web容器比较<br>一.缘由: 新公司平台是纯Java架构,有用到Java Web(JSP).Java 业务(EJB).Nginx..Websphere MQ.Mysql这样.大家知道java是跑在容器里的, 这里的业务要用到EJB故选用了Glassfish容器. EJB是什么?EJB是一个服务器端的组件模型,可以部署分布式应用程序.J

Linux下使用Apache实现域名转发(Tomcat/JBOSS)

Linux下安装.配置JDK就不细说了,网上的资料很多; 在安装apache时可能会遇到诸多问题,譬如APR not found,pcre-config for libpcre not found等问题,这都是和系统的具体环境有关,详细的解决办法这里不细说,推荐几个解决的方案,可以综合起来根据具体情况排查问题,千万不要过于依赖某一个方案,要对症下药,链接地址: http://www.cnblogs.com/JemBai/archive/2012/11/07/2759139.html http:/