java.lang.IllegalArgumentException:cookie 值或属性中的控制字符

2022-09-03 18:28:26

我试图在cookie中设置unicode值,但它不接受这一点并抛出异常。我已经检查了字符串的十六进制值,它是正确的,但在添加到cookie时会引发异常。

private void fnSetCookieValues(HttpServletRequest request,HttpServletResponse response) 
    {

        Cookie[] cookies=request.getCookies();
        for (int i = 0; i < cookies.length; i++) {

            System.out.println(""+cookies.length+"Name"+cookies[i].getName());

            if(cookies[i].getName().equals("DNString"))
            {   
                System.out.println("Inside if:: "+cookies[i].getValue()+""+cookies.length);
                try {

                    String strValue;
                    strValue = new String(request.getParameter("txtIIDN").getBytes("8859_1"),"UTF8");
                    System.out.println("Cookie Value To be stored"+strValue);
                    for (int j = 0; j < strValue.length(); j++) {

                        System.out.println("Code Point"+Integer.toHexString(strValue.codePointAt(j)));

                    }


                    Cookie ck = new Cookie("DNString",strValue);
                    response.addCookie(ck);

                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }

    }

我得到:

java.lang.IllegalArgumentException: Control character in cookie value or attribute.

将 Cookie 添加到响应对象时。我使用Tomcat 7和Java 7作为运行时环境。


答案 1

版本 0 Cookie 值在允许的字符中受到限制。它只允许 URL 安全字符。这包括字母数字字符(a-z,A-Z和0-9)和少数词汇字符,包括,,,和。所有其他字符在版本 0 Cookie 中无效。-_.~%

最好的办法是对这些字符进行 URL 编码。这样,URL中不允许的每个字符都将以这种形式进行百分比编码,该形式作为cookie值有效。%xx

因此,在创建 Cookie 时,请执行以下操作:

Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
// ...

在阅读饼干时,请执行:

String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
// ...

答案 2

这个答案可能与这个问题无关,但我在JBoss EAP上得到了这个错误,所以如果你使用的是JBoss EAP,你应该在 standalone.conf 中更改 EAP 语言.bat

找到此行

set “JAVA_OPTS=-Xms1G -Xmx1G -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m”

并在 -Xmx1G 之后添加此参数

-Duser.language=en


推荐