代码之家  ›  专栏  ›  技术社区  ›  LiorH

jboss 5截断base64 cookie字符串的trailing=

  •  5
  • LiorH  · 技术社区  · 15 年前

    从JBoss4升级到JBoss5之后,我注意到了最令人讨厌的回归。它截断base64 cookie值的尾随等号(“=”)。

    我花了很多时间才明白问题不是我的代码而是JBoss,我在谷歌上搜索了一下,发现它是一个已知的 issue .

    建议的解决方法是计算字符串长度并用尾随等号填充(长度的倍数为4)。

    由于我们的应用程序可以在多个应用服务器上运行(例如WebLogic、Webspehere),因此我非常不愿意为这个版本的JBoss添加这段特定的代码。

    有人遇到过这个吗?你能建议一个更聪明的解决方法吗?

    编辑: 多亏了@skaffman,我理解了我的问题,我不应该首先使用base64作为cookie字符串。在基64上有一个变量被调用 base64 url 应该用于此类字符串(cookie、url…)。例如,库Apache编解码器在其base 64实现中支持此变量。

    3 回复  |  直到 14 年前
        1
  •  6
  •   skaffman    14 年前

    您是否可以控制如何创建和编码/解码cookie?如果是这样,那么您可以切换到另一种编码机制,即不使用可能与cookie规范冲突的字符的编码机制。例如, Apache Commons Codec 包括一个 Hex 类,它可以对十六进制字符串之间的二进制数据进行编码和解码。它将大于base64中的等效数据,但这可能无关紧要。

    或者,您可以使用 Cookie API一点。JavaDoc Cookie.setValue() 说:

    对于版本0 cookie,值应该 不包含空格、括号, 圆括号, 等于符号 逗号, 双引号、斜杠、问题 标志、标志、冒号和 分号。空值不能 在所有浏览器上的行为都相同。

    因此,从技术上讲,base64编码与版本0 cookie不兼容,这可能是默认的。你可以试着打电话 setVersion(1) 在cookie上,看看这是否会产生影响,尽管这样会带来浏览器兼容性问题的风险。

        2
  •  1
  •   Alexander Torstling    15 年前

    如果我正确理解bug报告,编码器的正确实现将始终生成一个4的倍数的字符串,因此如果添加bug修复程序,它将不会在JBoss以外的其他应用服务器中触发。因此,您的代码将在所有服务器上工作。另一方面,也许您可以将它作为servlet过滤器来实现,这对您的应用程序来说是最小的干扰。

        3
  •  1
  •   bala    14 年前

    对于jboss 5,设置以下系统属性:

    org.apache.catalina.strict_servlet_compliance=false

    巴拉