`
lliang54
  • 浏览: 4366 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

tomcat 服务器下的cookie 实现 详解

 
阅读更多

cookie 的作用,就是当一个浏览器通过http 请求访问一个服务器时,这个服务器会返回key/value 键值对给客户端浏览器,在servlet 中可以这样增加cookie ,tomcat的 版本是7

 

public void addcookies(HttpServletResponse response,String key,String value){
		Cookie cookie = new Cookie(key,value);
		response.addCookie(cookie);
	}

 

 

生成cookie 对象,将对象增加到httpServletResponse 对象中,用于返回到客户端,在tomcat 服务器中,其实就是调用response 的门面方法。org.apache.catalina.connector.ResponseFacade 的addCookie 方法

 

  @Override
    public void addCookie(Cookie cookie) {
        //判断response 是否提交
        if (isCommitted()) {
            return;
        }

        response.addCookie(cookie);

    }

  将cookie 对象委托给被装饰的org.apache.catalina.connector.Response 类处理,ResponseFacade  是Responese 类的一个门面类,

 

 public void addCookie(final Cookie cookie) {

        if (included || isCommitted()) {
            return;
        }
       // 生成符合http 协议 cookie 格式的字符串
        final StringBuffer sb = generateCookieString(cookie);
        //将字符串放到响应头中
        addHeader("Set-Cookie", sb.toString());
    }

 具体的生成方式

 

 

  public StringBuffer generateCookieString(final Cookie cookie) {
        final StringBuffer sb = new StringBuffer();
        //web application code can receive a IllegalArgumentException
        //from the appendCookieValue invocation
        if (SecurityUtil.isPackageProtectionEnabled()) {
            AccessController.doPrivileged(new PrivilegedAction<Void>() {
                @Override
                public Void run(){
                    ServerCookie.appendCookieValue
                        (sb, cookie.getVersion(), cookie.getName(),
                         cookie.getValue(), cookie.getPath(),
                         cookie.getDomain(), cookie.getComment(),
                         cookie.getMaxAge(), cookie.getSecure(),
                         cookie.isHttpOnly());
                    return null;
                }
            });
        } else {
            ServerCookie.appendCookieValue
                (sb, cookie.getVersion(), cookie.getName(), cookie.getValue(),
                     cookie.getPath(), cookie.getDomain(), cookie.getComment(),
                     cookie.getMaxAge(), cookie.getSecure(),
                     cookie.isHttpOnly());
        }
        return sb;
    }

 

 

 

 org.apache.tomcat.util.http.ServerCookie 类是处理生成cookie 的一个实体类,继承 Serializable 接口,可以序列化在网络上传输具体生成cookie 的处理逻辑

 public static void appendCookieValue( StringBuffer headerBuf,
                                          int version,
                                          String name,
                                          String value,
                                          String path,
                                          String domain,
                                          String comment,
                                          int maxAge,
                                          boolean isSecure,
                                          boolean isHttpOnly)
    {
        StringBuffer buf = new StringBuffer();
        // Servlet implementation checks name
        buf.append( name );
        buf.append("=");
        // Servlet implementation does not check anything else

        /*
         * The spec allows some latitude on when to send the version attribute
         * with a Set-Cookie header. To be nice to clients, we'll make sure the
         * version attribute is first. That means checking the various things
         * that can cause us to switch to a v1 cookie first.
         *
         * Note that by checking for tokens we will also throw an exception if a
         * control character is encountered.
         */
        // Start by using the version we were asked for
        int newVersion = version;

        // If it is v0, check if we need to switch
        if (newVersion == 0 &&
                (!CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isHttpToken(value) ||
                 CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isV0Token(value))) {
            // HTTP token in value - need to use v1
            newVersion = 1;
        }

        if (newVersion == 0 && comment != null) {
            // Using a comment makes it a v1 cookie
           newVersion = 1;
        }

        if (newVersion == 0 &&
                (!CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isHttpToken(path) ||
                 CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isV0Token(path))) {
            // HTTP token in path - need to use v1
            newVersion = 1;
        }

        if (newVersion == 0 &&
                (!CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isHttpToken(domain) ||
                 CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 &&
                 CookieSupport.isV0Token(domain))) {
            // HTTP token in domain - need to use v1
            newVersion = 1;
        }

        // Now build the cookie header
        // Value
        maybeQuote(buf, value);
        // Add version 1 specific information
        if (newVersion == 1) {
            // Version=1 ... required
            buf.append ("; Version=1");

            // Comment=comment
            if ( comment!=null ) {
                buf.append ("; Comment=");
                maybeQuote(buf, comment);
            }
        }

        // Add domain information, if present
        if (domain!=null) {
            buf.append("; Domain=");
            maybeQuote(buf, domain);
        }

        // Max-Age=secs ... or use old "Expires" format
        if (maxAge >= 0) {
            if (newVersion > 0) {
                buf.append ("; Max-Age=");
                buf.append (maxAge);
            }
            // IE6, IE7 and possibly other browsers don't understand Max-Age.
            // They do understand Expires, even with V1 cookies!
            if (newVersion == 0 || CookieSupport.ALWAYS_ADD_EXPIRES) {
                // Wdy, DD-Mon-YY HH:MM:SS GMT ( Expires Netscape format )
                buf.append ("; Expires=");
                // To expire immediately we need to set the time in past
                if (maxAge == 0) {
                    buf.append( ancientDate );
                } else {
                    OLD_COOKIE_FORMAT.get().format(
                            new Date(System.currentTimeMillis() +
                                    maxAge*1000L),
                            buf, new FieldPosition(0));
                }
            }
        }

        // Path=path
        if (path!=null) {
            buf.append ("; Path=");
            maybeQuote(buf, path);
        }

        // Secure
        if (isSecure) {
          buf.append ("; Secure");
        }

        // HttpOnly
        if (isHttpOnly) {
            buf.append("; HttpOnly");
        }
        headerBuf.append(buf);
    }

 tomcat 最终构造响应头的方法在org.apache.coyote.http11.AbstractHttp11Processor 的prepareResponse中,具体片段 

 

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

 

 

分享到:
评论

相关推荐

    Tomcat与JavaWeb开发技术详解源代码

    【标签】:“Tomcat与JavaWeb开发技术详解”表明这是关于Tomcat服务器和基于Java的Web应用开发的技术指南,而“源代码”意味着包含了实现这些技术的实践代码。 【压缩包子文件的文件名称列表】:尽管具体的文件名...

    《Tomcat与JavaWeb开发技术详解》第二版勘误信息

    《Tomcat与JavaWeb开发技术详解》第二版的勘误信息反映了作者孙卫琴对于书籍质量的严谨态度以及对读者反馈的重视。书籍中的错误主要集中在概念性错误、代码示例的印刷错误以及代码逻辑的问题上。以下是这些勘误信息...

    Tomcat与Java+Web开发技术详解PDF

    《Tomcat与Java+Web开发技术详解》这本书深入探讨了使用Tomcat服务器进行Java Web应用程序开发的核心技术。Tomcat作为一款轻量级的Java Servlet容器,是许多开发者首选的平台,因为它易于配置、运行高效,并且与Java...

    Tomcat与Java Web开发技术详解(附带阅读器)

    《Tomcat与Java Web开发技术详解》是一本深入解析Tomcat服务器和Java Web开发的教程,结合了理论与实践,旨在帮助开发者全面理解和掌握这两项核心技术。Tomcat作为开源的Java Servlet容器,是许多Java Web应用程序的...

    tomcat redis session.rar

    在集群模式下,多台Tomcat服务器可以协同工作,提供更高的可用性和可伸缩性。但是,由于每台服务器都有自己的内存空间,Session数据无法共享。 2. **Session管理**:Session是Web应用中用于跟踪用户状态的一种机制...

    Tomcat+java+web+开发技术详解-孙卫琴-第二版 源码

    《Tomcat+Java+Web开发技术详解》是孙卫琴老师撰写的一本深入解析Java Web开发的书籍,第二版在原有的基础上进行了更新和完善,旨在帮助读者掌握基于Tomcat服务器的Java Web应用程序开发技术。源码文件包含的是书中...

    Tomcat与Java.Web开发技术详解

    《Tomcat与Java.Web开发技术详解》是一本深入探讨Tomcat服务器和Java Web应用程序开发的专业教程,由飞思科技出版。这本书旨在为开发者提供全面、详细的指导,帮助他们理解和掌握在Tomcat上构建和部署Java Web应用的...

    HTTP Cookie 协议管理标准分析以及结构实现

    ##### Set-Cookie字段详解 当服务器需要向客户端发送Cookie时,会在HTTP响应头中使用`Set-Cookie`字段。该字段的一般格式如下: ```plaintext Set-Cookie: name=value; expires=xxx,xxx,xxxxxxxxxx; path=/xxx; ...

    Linux下安装与配置基于nginx的tomcat负载均衡和集群(通过cookie分发请求)

    4. **部署Tomcat服务器**: 在多台机器上安装并配置Tomcat,确保应用部署一致。可以使用VMWare虚拟机来模拟多个服务器环境,参考“VMWare虚拟机上网设置图详解.doc”文档进行网络配置,使每台虚拟机都能正常访问。 5...

    Apache和Tomcat集群配置步骤(Apache2.2,Tomcat6.0).

    - 编辑 `conf/extra/httpd-vhosts.conf` 文件,添加相应的虚拟主机配置,以便能够负载均衡到多个Tomcat服务器上。 #### 四、集群配置 完成上述步骤后,还需要进行集群配置以实现负载均衡等功能。 - **配置负载...

    Nginx tomcat mybatis 集群部署

    单一Tomcat服务器在较为理想的情况下能承受的并发访问量大约在150至200之间,这意味着其最大用户容量大约在1500至4000人之间。这对于面向全国甚至全球用户提供服务的大型网站而言显然远远不够。为了解决这一问题,...

    仿写tomcat

    【仿写Tomcat服务器详解】 Tomcat是一款广泛应用的开源Java Servlet容器,它是Apache软件基金会的Jakarta项目的一部分,主要用于运行Java Web应用程序。本项目旨在仿写Tomcat服务器,以实现基本的Web服务功能,包括...

    apache-tomcat-9.0.24.rar

    首先,Apache Tomcat 9.0.24是Tomcat服务器的一个特定版本,它支持最新的Java EE 8标准,提供了更高的性能和稳定性。安装Tomcat需要下载对应的版本(如本例中的9.0.24)并解压到指定目录。通常,你会在“apache-...

    tomcat7 API

    《Tomcat7 API详解》 Tomcat7是Apache软件基金会的Apache Tomcat项目的一个版本,它是一个开源的、免费的Web应用服务器,主要用于部署Java Servlet和JavaServer Pages(JSP)。Tomcat7 API文档则是开发者理解和使用...

    tomcat是如何工作的

    - **Engine**:代表整个Tomcat服务器,可以包含多个Host。 - **Host**:代表虚拟主机,可以包含多个Context。 - **Context**:代表一个Web应用,可以包含多个Wrapper。 - **Wrapper**:代表一个具体的Servlet实例。 ...

    jsp论坛源代码的(实现留言,回复)

    【JSP论坛源代码实现详解】 JSP(JavaServer Pages)是一种基于Java技术的动态网页开发工具,它允许开发者在HTML、XML或者其他标记语言中嵌入Java代码,从而实现动态内容的生成。在这个名为“BBS项目组”的压缩包中...

    apache+tomcat分布式集群.rar

    Apache 和 Tomcat 分布式集群配置详解 在高并发、高可用性要求的环境中,单一的服务器往往无法满足业务需求,这时我们需要构建分布式集群来提升系统性能和稳定性。Apache 和 Tomcat 的组合是常见的Web服务架构,...

Global site tag (gtag.js) - Google Analytics