一、背景:
公司最近将jboss的版本从4.5 升级到7,之后发现从cookie中,获取不到用户的信息了。经过debug发现,保存用户信息的cookie,在request.getCookie()之后就是被截断了。本来是 key=x_l=1&x_locale=zh_CN&no_popup_today=n&user=xxx|xxx|xxx|xxx|xxx&xxx=xxx 但是获取到值是key=x_l。
二、相关代码以及问题解决:
在jboss包里 org.apache.tomcat.util.http.Cookies 类里 有如下方法:
/** * Given the starting position of a token, this gets the end of the token, with no separator characters in between. * JVK */ private static final int getTokenEndPosition(byte bytes[], int off, int end, int version, boolean isName) { int pos = off; while (pos < end && (!CookieSupport.isHttpSeparator((char) bytes[pos]) || version == 0 && CookieSupport.ALLOW_HTTP_SEPARATORS_IN_V0 && bytes[pos] != '=' && !CookieSupport.isV0Separator((char) bytes[pos]) || !isName && bytes[pos] == '=' && CookieSupport.ALLOW_EQUALS_IN_VALUE)) { pos++; } if (pos > end) return end; return pos; }
当拿到x_l=1&x_locale=zh_CN&no_popup_today=n&x_user=user=xxx|xxx|xxx|xxx|xxx&xxx=xxx 这个字符串的时候,会通过上面的方法,来找到字符串最后一个可用字符的位置,然后截断。自然我们获取到key=x_l 也正式这个方法截断导致的。当遇到“=”的时候
bytes[pos] == '=' && CookieSupport.ALLOW_EQUALS_IN_VALUE 这个判断依赖与CookieSupport.ALLOW_EQUALS_IN_VALUE的值。
在CookieSupport 类中可以发现:
ALLOW_EQUALS_IN_VALUE = Boolean.valueOf(System.getProperty( "org.apache.tomcat.util.http.ServerCookie.ALLOW_EQUALS_IN_VALUE", "false")).booleanValue();
所以找到问题的答案,将 org.apache.tomcat.util.http.ServerCookie.ALLOW_EQUALS_IN_VALUE配置为true,及解决问题。
但是为了之前jboss4.5没有这个问题呢? 参见:http://thenitai.com/2013/05/02/tomcat-truncating-cookies-with-values/
三、jboss 7 cookie 解析流程:
四、扩展:
cookie版本的问题:网上很容易找到对应资料,摘录一段:
1. Cookie的兼容性问题
Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。
2. Cookie的内容
同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。
虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。
3、cookie version 1规范
RFC 2109 参见:http://www.faqs.org/rfcs/rfc2109.html
关于cookie中value定义 参见:http://www.faqs.org/rfcs/rfc2068.html
4、cookie vesion 2 规范:http://www.faqs.org/rfcs/rfc2965.html
在 CookieSupport 类也可以看到定义的特殊字符:
/* Excluding the '/' char by default violates the RFC, but it looks like a lot of people put '/' in unquoted values: '/': ; //47 '\t':9 ' ':32 '\"':34 '(':40 ')':41 ',':44 ':':58 ';':59 '<':60 '=':61 '>':62 '?':63 '@':64 '[':91 '\\':92 ']':93 '{':123 '}':125 */ if (CookieSupport.FWD_SLASH_IS_SEPARATOR) { HTTP_SEPARATORS = new char[] { '\t', ' ', '\"', '(', ')', ',', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' }; } else { HTTP_SEPARATORS = new char[] { '\t', ' ', '\"', '(', ')', ',', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '{', '}' }; }
相关推荐
在 Java 项目中,迁移到 JBoss 可能会出现各种问题,例如版本兼容问题、设置问题等。本文将介绍如何解决这些问题,包括如何配置 JBoss,使得 Spring 项目能够正常运行。 版本兼容问题 在将 Tomcat 项目迁移到 ...
【JBOSS迁移到WEBSPHERE的简要流程】 迁移JBOSS应用程序到IBM的WEBSPHERE平台是一项涉及多个步骤的技术任务,主要目的是确保应用程序在新的应用服务器环境中能够正常运行。以下是一个简化的迁移过程: 1. **安装...
在使用jBoss Enterprise Application Platform (EAP) 6.2 或 jBoss Application Server (AS) 7及以上版本的过程中,可能会遇到字符编码问题,即所谓的“乱码”现象。这种现象通常出现在应用程序的日志、输出数据或与...
此外,JBoss Tools还包含了其他一些关键功能,如支持Java EE 7规范,包括WebSocket、JAX-RS 2.0和JavaServer Faces(JSF)2.2等。这些工具使得开发者可以充分利用最新的技术标准,构建高效且响应迅速的企业级Web应用...
JBoss AS7 是一个开源的Java应用服务器,它是JBoss企业应用平台(EAP)...他从1997年开始学习Java,并一直跟随Sun公司发布的新API前进,2000年加入JBoss社区,自此参与了多次成功的从商业平台到开源平台的软件迁移项目。
本文档提供了jboss7开发和部署的详细指导,涵盖了jboss7的下载与安装、Eclipse中配置jboss7、项目部署和JNDI获取等方面的内容,旨在帮助开发者快速上手jboss7,并将jboss4.2版本平滑地移植到jboss7。
【JBoss AS7教程】 JBoss Application Server 7(简称JBoss AS7)是Red Hat公司推出的一款开源Java EE应用服务器,它基于EAP(Enterprise Application Platform)的轻量级版本,提供了对Java EE 6规范的全面支持。...
在JBoss 7及以上版本中,对EJB的配置过程相较于之前的版本有所变化,主要涉及到两个关键的配置文件:`jboss-ejb3.xml`和`ejb-jar.xml`。 `ejb-jar.xml`文件是EJB模块的标准配置文件,遵循Java EE规范。在这个文件中...
用于将基于JBoss AS 5的服务器的配置迁移到基于JBoss AS 7的服务器的程序。 适用于源服务器: JBoss AS 5.1+ JBoss EAP 5.x 适用于目标服务器: JBoss AS 7.1.1以上 JBoss EAP 6.x(支持6.1+) Wildfly 8.x 它...
整体而言,Jboss7快速入门手册覆盖了从安装到配置再到管理的全方位内容,使得用户能够快速掌握Jboss7的使用。文档基于Jboss7.1.1 Final版本编写,并且参考了官方的多种指南文档。尽管文档内容并未全部经过测试,但...
在配置 Jboss 服务器之前,需要将 Jboss 服务器安装包解压到指定目录下,例如 D:\jboss-5.1.0.GA。然后,需要配置 JBOSS_HOME 环境变量,以便 Jboss 服务器可以找到安装目录。 三、项目打包 在部署 Jboss 项目之前...
3. **解压并配置JBoss**:将下载的JBoss压缩包解压到合适的目录,然后在MyEclipse中进行配置。点击“Window” -> “Preferences” -> “Server” -> “Runtime Environments”。 4. **添加新的运行时环境**:在打开...
【JBoss7学习笔记】 JBoss Application Server,简称JBoss AS,是Red Hat公司开发的一款开源Java EE应用服务器,而JBoss7则是其一个重要的版本,带来了许多性能优化和架构改进。这篇学习笔记将深入探讨JBoss7的核心...
### jboss7 文档知识点详解 #### 一、JBoss AS 7简介 JBoss AS 7(Application Server 7)是JBoss企业级中间件的一部分,由Red Hat开发并维护,是一个开源的Java应用服务器。它支持最新的Java EE 6规范,提供了...
总结来说,JBoss7+Apache集群和Solr集群的配置涉及到多个层面,包括服务器配置、安全策略、负载均衡以及分布式服务的同步和部署。正确实施这些步骤,可以构建出高可用、高性能的IT系统,满足企业级应用的需求。在...
【JBoss 概述】 JBoss 是一个开源的、基于Java的、全面实现了J2EE规范的应用服务器。它提供了企业级的功能,如EJB(Enterprise JavaBeans)、JMS(Java Message Service)、JTS/JTA(Java Transaction Service / ...
### JBoss7部署与EJB3.1开发入门 #### 一、环境搭建与配置 在开始开发基于EJB3.1的项目前,首先需要搭建良好的开发环境。这包括JDK的正确配置,Eclipse3.7的下载与解压,以及JBoss7.1的下载与解压。其中,Eclipse...
JBoss Application Server 7 (JBoss AS7) 是一款开源的应用服务器,以其高效能和快速启动而受到赞誉。然而,为了确保最佳性能,对服务器进行适当的配置和调优至关重要。大约80%的应用性能取决于代码质量,但剩下的20...
- `7.2.1.GA-patch.xml` 至 `7.2.5.GA-patch.xml`: 这些文件代表了 JBoss EAP 7.2.1 到 7.2.5 的 GA 补丁,每个补丁可能包含对特定问题的修复或功能增强。 - `jboss-eap-7.2.6.CP`: 这是 JBoss EAP 7.2.6 的累积...