`
小码哥BASE64
  • 浏览: 124909 次
社区版块
存档分类
最新评论

Tomcat 对 Cookie的聪明处理。

阅读更多

    近日使用Tomcat调试的时候,使用response写入一个Cookie,发现Cookie的值带上了双引号,百思不得其解,查找源码发现Tomcat在写入Cookie值有"/" 的时候,为避免错误,Tomcat做了以下处理

org.apache.tomcat.util.http.ServerCookie

 

    private static void maybeQuote (StringBuffer buf, String value) {
        if (value==null || value.length()==0) {
            buf.append("\"\"");
        } else if (CookieSupport.alreadyQuoted(value)) {
            buf.append('"');
            buf.append(escapeDoubleQuotes(value,1,value.length()-1));
            buf.append('"');
        } else if (CookieSupport.isHttpToken(value) &&
                !CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 ||
                CookieSupport.isV0Token(value) &&
                CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0) {
            buf.append('"');
            buf.append(escapeDoubleQuotes(value,0,value.length()));
            buf.append('"');
        } else {
            buf.append(value);
        }
    }

 查询Tomcat文档,解释如下:

org.apache.catalina. STRICT_SERVLET_COMPLIANCE

If this is true the following actions will occur:

  • any wrapped request or response object passed to an application dispatcher will be checked to ensure that it has wrapped the original request or response. (SRV.8.2 / SRV.14.2.5.1)
  • a call to Response.getWriter() if no character encoding has been specified will result in subsequent calls to Response.getCharacterEncoding() returningISO-8859-1 and the Content-Type response header will include a charset=ISO-8859-1 component. (SRV.15.2.22.1)
  • every request that is associated with a session will cause the session's last accessed time to be updated regardless of whether or not the request explicitly accesses the session. (SRV.7.6)
  • cookies will be parsed strictly, by default v0 cookies will not work with any invalid characters. 
    If set to false, any v0 cookie with invalid character will be switched to a v1 cookie and the value will be quoted.
  • the path in ServletContext.getResource / getResourceAsStream calls must start with a "/".
    If set to false, code like getResource("myfolder/myresource.txt") will work.

 

If this is true the default value will be changed for:

  • org.apache.catalina.connector.Request. ALLOW_EMPTY_QUERY_STRING property
  • The webXmlValidation attribute of any Context element.
  • The webXmlNamespaceAware attribute of any Context element.
  • The tldValidation attribute of any Context element.

 

If not specified, the default value of false will be used.

 

解决办法:

catalina.properties里边增加一行:

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true

或者自行修改源码

 影响版本:暂时确认有Tomcat 6、7

 

 

 

 

分享到:
评论
1 楼 Tomcat911 2014-05-06  
高手

相关推荐

    tomcat修改jsessionid在cookie中的名称

    为了更好地理解上述配置是如何工作的,接下来将对Tomcat 5.x 和 6.x/7.x 的源代码进行简单的分析。 ##### 1. Tomcat 5.x 源码解析 在Tomcat 5.x 中,`SESSION_COOKIE_NAME` 的定义如下: ```java public static ...

    tomcat启动不了问题处理

    ### tomcat启动不了问题处理 在IT领域,Tomcat服务器是一款非常流行的开源Web服务器,它主要用来部署Java Web应用程序。然而,在使用过程中,用户可能会遇到Tomcat无法启动的问题。本文将详细探讨导致Tomcat启动...

    tomcat处理一个http请求的详细过程

    tomcat中server配置文件的结构,以及处理一个http请求的全过程

    tomcat7tomcat8tomcat9

    此外,Tomcat 8在性能和安全性上都有所提升,增强了对大型应用的处理能力。 Tomcat 9则是在2013年晚些时候发布,主要增加了对Java EE 7的支持,包括WebSocket 1.1、JMS 2.0和JSON-P等新特性。它改进了多线程模型,...

    tomcat7,tomcat8,tomcat9

    Tomcat8的另一个亮点是对WebSocket协议的支持,这使得开发实时Web应用变得更加容易。 **Tomcat9**: Tomcat9是在2014年推出,主要支持Java Servlet 4.0和JSP 2.3规范。此版本进一步提升了性能和安全性,尤其是在...

    tomcat 7 和 tomcat 8

    1. 发布时间:Tomcat 7在2011年发布,作为Tomcat 6的升级版,提供了对Java EE 6的支持。 2. Java EE支持:Tomcat 7支持Servlet 3.0、JSP 2.2、EL 2.2和WebSocket 1.0等规范,使得开发者能够利用新的特性进行Web应用...

    tomcat5.5tomcat最新客户端

    tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat最新客户端tomcat...

    tomcat 环境配置及问题处理

    ### Tomcat环境配置详解及问题处理 #### 一、Tomcat简介 Apache Tomcat是一款开源的Servlet容器,它能够提供对Servlet和JavaServer Pages技术的支持,并且可以作为HTTP Web服务器来使用。通常用于开发和部署Web...

    Tomcat7.0 tomcat最新版本

    1. **Servlet 3.0支持**:Tomcat 7.0引入了对Servlet 3.0规范的支持,这意味着开发者可以利用新的特性,如异步处理、注解配置、动态注册Servlet和过滤器,以及初始化参数等,简化开发流程。 2. **JSP 2.2支持**:...

    tomcat5/tomcat5.5安装包

    Tomcat 5.0是Tomcat的一个重要里程碑,它引入了对Servlet 2.4和JSP 2.0规范的支持,提供了更好的多线程处理能力,并对内存管理进行了改进,提升了服务器的稳定性和性能。同时,它还改进了安全管理,增强了日志功能,...

    基于tomcat服务器的跨域处理

    基于tomcat服务器的跨域处理, 包含cors-filter-1.7.jar,Java -property-utils-1.9.jar 配置跨域 <!--跨域-->  <groupId>com.thetransactioncompany</groupId>  <artifactId>Java-property-utils  <version>...

    tomcat 7 最新版本 apache-tomcat-7.0.109

    1. **Servlet 3.0支持**:Tomcat 7全面支持Servlet 3.0规范,这引入了诸如异步处理、注解配置、动态部署等功能,提高了Web应用的开发效率和性能。 2. **JSP 2.2支持**:它包含对JSP 2.2的实现,提供了更多的EL...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    通过深入学习,读者能够对Tomcat的内部机制有全面而深入的理解,从而更好地优化和调试应用。 Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是开发和部署Java ...

    Tomcat Tomcat Tomcat Tomcat

    Tomcat,全称Apache Tomcat,是Apache软件基金会的一个开源项目,它是一个实现了Java Servlet和JavaServer Pages(JSP)技术的Web应用服务器,主要用于处理Java的动态内容。Tomcat是轻量级的,相比其他如IBM ...

    tomcat源码

    3. **会话管理**:Tomcat如何实现Session跟踪,包括Cookie、URL重写和基于数据库的持久化策略。 4. **连接器与协议处理**:Coyote如何处理HTTP请求,包括解析请求头、读取请求体、构建响应,以及处理Keep-Alive和...

    Tomcat性能调优方案

    虽然Tomcat也可以作web服务器,但其处理静态html的速度比不上Apache,且其作为web服务器的功能远不如Apache,因此把Apache和Tomcat集成起来,将html和Jsp的功能部分进行明确分工,让Tomcat只处理Jsp部分,其他的由...

    tomcat6的源码

    2. **线程模型**:Tomcat使用了多线程模型来处理并发请求。源码中的`Catalina`和` Coyote`组件涉及到了这部分内容,包括Acceptor线程和Worker线程的管理。 3. **生命周期管理**:每个Tomcat组件都有自己的生命周期...

    idea tomcat runner插件

    4. **配置管理**:支持对Tomcat的配置进行自定义,包括端口号、工作目录等,满足不同项目的特定需求。 5. **日志查看**:方便查看Tomcat服务器的日志输出,帮助开发者定位和解决问题。 **二、安装与使用** 1. **...

    webServer tomcat5 / tomcat6 / tomcat7 / tomcat8

    1. **Tomcat 5**:这是Tomcat的一个重大升级,主要引入了对Servlet 2.4和JSP 2.0规范的支持。此外,它增强了安全性,提供了更好的管理工具,以及对NIO(非阻塞I/O)的支持,提高了并发性能。 2. **Tomcat 6**:此...

    Tomcat7及Tomcat8

    2. **Jasper增强**:Tomcat 7的Jasper引擎对JSP编译进行了优化,支持JSP 2.2标准,提供了更多的错误检查和改进的开发体验。 3. **更好的安全管理**:增加了基于角色的安全管理(RBAC),可以更精细地控制用户的访问...

Global site tag (gtag.js) - Google Analytics