Tomcat 对 Cookie的聪明处理。

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

org.apache.tomcat.util.http.ServerCookie

 

Java代码  

  1. <span>    private static void maybeQuote (StringBuffer buf, String value) {  
  2.         if (value==null || value.length()==0) {  
  3.             buf.append("\"\"");  
  4.         } else if (CookieSupport.alreadyQuoted(value)) {  
  5.             buf.append('"');  
  6.             buf.append(escapeDoubleQuotes(value,1,value.length()-1));  
  7.             buf.append('"');  
  8.         } <span style="color: #ff0000;">else if (CookieSupport.isHttpToken(value) &&  
  9.                 !CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 ||  
  10.                 CookieSupport.isV0Token(value) &&  
  11.                 CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0)</span> {  
  12.             buf.append('"');  
  13.             buf.append(escapeDoubleQuotes(value,0,value.length()));  
  14.             buf.append('"');  
  15.         } else {  
  16.             buf.append(value);  
  17.         }  
  18.     }  
  19. </span>  

 查询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

 

时间: 2024-08-30 15:13:22

Tomcat 对 Cookie的聪明处理。的相关文章

Tomcat+Servlet保存Cookie到浏览器

  我们在访问一些大型购物网站的时候,都有添加到购物车这一项,而购物车里面的东西都是临时的,商品买完之后购物车里面的东西可能就没有价值了.如果把这些临时的东西都保存到服务器的话,无疑是一种资源浪费.因此今天我们就引入一个新名词Cookie,说是新名词其实一点也不陌生,我们电脑或者浏览器清理垃圾的时候都有轻触Cookie这一项.其实这就是我们访问一些网站的时候,开发者为了避免自己服务器压力,或者减少服务器的存储浪费,而把一些临时的与用户相关的文件或者信息保存到用户电脑上.   这样的技术是怎样实现

Apache(mod_proxy)+Tomcat负载均衡配置

   要想使用Apache做反向代理,实现Tomcat负载均衡,首先你要知道有几种连接方式,怎样连接的,还有集群方面比较关心的问题,如何保持Session持久化.原来部署过mod_jk方式的,相对http_proxy比较复杂点,这次就部署测试下http_proxy,因为本公司大多数系统都是Ubuntu,所以这次也用Ubuntu系统吧!与CentOS相比配置基本相同,只是apache安装和配置路径不同.那就简单介绍下,让没有搞过Apche+Tomcat集群的博友们心里有个底. 1.Tomcat+A

Cookie 与 Session

Cookie 与 Session 是很常用的实现 Http 状态的技术,在不断的使用中,自己也对其有所理解.我接下来的讨论,是基于下面的顺序的: 1.为什么要使用 Cookie 和 Session 由于 Http 协议的请求过程,是基于 TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,这个过程是无状态的.在有些时候,是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的.有 针对性的去分析某些客户端的习惯.这些时候,就需要去记录客户端的连接状态,识别请求的状态等.为了解决类似

Tomcat中用web.xml控制Web应用详解

web|xml|控制|详解 1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义).所有部署描述符文件的顶层(根)元素为web-app.请注意,XML元素不像HTML,他们是大小写敏感的.因此,web-

Java操作Cookie详解

1.设置Cookie Cookie cookie = new Cookie("key", "value"); cookie.setMaxAge(60); 设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效. cookie.setPath("/test/test2"); 设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xm

java中cookie操作详细

1.设置Cookie  代码如下  Cookie cookie = new Cookie("key", "value"); cookie.setMaxAge(60);   设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效.  代码如下 cookie.setPath("/test/test2");   设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getConte

post-OkHttp使用cookie登录后如何提交multipart/form-data,求指点

问题描述 OkHttp使用cookie登录后如何提交multipart/form-data,求指点 之前也失败了,尝试了各种方法,最后选择cookie,但是我在报头里添加了cookie, 然后post一份form-data数据怎么失败了,这是我的代码: 这是使用chrome查看发送的数据,属于request payload: 解决方案 Tomcat 下 JSP(enctype="multipart/form-data") post 提交时中文乱码解决方案

JavaWeb 后端 &lt;一&gt; 之 Tomcat服务器 - Http协议 学习笔记

1.Web开发概述 1.1服务器上的资源分类: a.静态资源:指web页面中供人们浏览的数据始终是不变.html css js 图片 多媒体 b.动态资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同.JSP/Servlet.php.asp 下面为简单的java程序 模拟服务器提供资源 访问 本地端口1111即可得到服务器的资源 public class Myserver {     public static void main(String[] a

使用 CAS 在 Tomcat 中实现单点登录

CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特点: 开源的企业级单点登录解决方案. CAS Server 为需要独立部署的 Web 应用. CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等. CAS 原理和协议