Cookie编程问题及Base64中文编码问题

原文地址:http://www.blogjava.net/persister/archive/2009/10/02/297103.html

调用Cookie对象的构造函数可以创建Cookie。Cookie对象的构造函数有两个字符串参数:Cookie名字和Cookie值。

Cookie cookie = new Cookie(name,value);

调用下面的方法时出现一个问题
response.addCookie(cookie);//cookie 是一个Cookie实例

问题报错:java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

很显然Cookie之中存在了非法参数,经过测试发现cookie之中包含""r"n"、""n"时就会出现这个异常。

因为cookie中部分值是通过文本框录入的,在<textarea/>标签中键入回车键后,value值中就加入了""r"n",
把这样的值赋给cookie,执行response.addCookie(cookie);时则出现异常。

解决办法:使用String类的replace()方法。
Java代码

1 str = str.replace(""r"n", "<br>");            
2 str = str.replace(""n", "<br>");

4 Cookie cookie = new Cookie(‘cookName‘,str);
5 //永久有效
6 cookie.setMaxAge(60*60*24*365);
7 response.addCookie(cookie);

刚才看到Base64错误,通常不将数据直接保存在cookie中,而要进行Base64编码

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8"))); //设置UTF-8否则会乱码
Debug.log("Ba64:"+ cookieValueBase64, module);
cookieValueBase64 = cookieValueBase64.replace(""r"n", "");              
cookieValueBase64 = cookieValueBase64.replace(""n", "");
Cookie cookie = new Cookie(key, cookieValueBase64);
cookie.setMaxAge(time);
cookie.setPath("/");// 设置適用路经
res.addCookie(cookie);// 将cookie添加到response对象中。由response对象返回给户端

取得时候:new String(Base64.decode(ck.getValue()),"UTF-8");       

这样做就行了吗?发现还是不够,出现什么问题呢?
原来如果cookie值中出现等号,那么取出来的值只取等号前面的值,等号及等号后面的值会被忽略

Base64编码难保不出现等号,怎么解决呢?采用UrlEncoder和UrlDecoder,存的时候:

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8")));
cookieValueBase64 = cookieValueBase64.replace(""r"n", "");              
cookieValueBase64 = cookieValueBase64.replace(""n", "");     
String cookieValueUrlEncode = URLEncoder.encode(cookieValueBase64, "UTF-8");

取的时候:

new String(Base64.decode(URLDecoder.decode(ck.getValue(), "UTF-8")),"UTF-8");

这样很多特殊字符就可以了。

时间: 2024-10-12 09:22:55

Cookie编程问题及Base64中文编码问题的相关文章

C#中的cookie编程

Cookie就是所谓的" 小甜饼" ,他最早出现是在Netscape Navigator 2.0中.Cookie其实就是由Web服务器创建的.将信息存储在计算机上的文件.那么为什么Web服务器要在客户机上面创建如此文件?这是因为当客户机发送一个请求到WEB服务器时(譬如准备浏览页面时),无论此客户机是否是第一次来访,服务器都会把它当作第一次来对待,WEB服务器所做的工作只是简单的进行响应,然后就关闭与该用户的连接.这样处理过程所带来的缺点时显而易见的.自从网景公司开发出Cookie以后

C# Cookie编程

Cookie,他最早出现是在Netscape Navigator 2.0中.Cookie其实就是由Web服务器创建的.将信息存储在机上的文件.那么为什么Web服务器要在客户机上面创建如此文件?这是因为当客户机发送一个请求到WEB服务器时(譬如准备浏览页面时),无论此客户机. 是否是第一次来访,服务器都会把它当作第一次来对待,WEB服务器所做的工作只是简单的进行响应,然后就关闭与该用户的连接.这样处理过程所带来的缺点时显而易见的.自从网景公司开发出Cookie以后,就可以利用 Cookie来保存用

Asp.net操作cookie大全

实例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 下面是写cookie  HttpCookie cookie = new HttpCookie("Info");//定义cookie对象以及名为Info的项  DateTime dt = DateTime.Now;//定义时间对象  TimeSpan ts=

cookie (储存在用户本地终端上的数据)

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265[1]  .(可以叫做浏览器缓存) 中文名 储存在用户本地终端上的数据 外文名 Cookie 复数形式 Cookies 目录 1 技术简介 2 功能特点 3 具体含义 4 诞生时间 5 主要用途 6 生存周期 7 识别功能 8 脚本攻击 9 相关问题 10 设置Co

Java:Cookie实现记住用户名、密码

package com.gamecenter.api.util; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.servlet.FilterChain;

Python交互式编程

Python之ipython.notebook.matplotlib安装使用 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程 Window上在安装Python时已经已经安装了默认的交互式编程客户端 备注:> 中文编码 #!/usr/bin/python# -*- coding: UTF-8 -*- 以下进行逐步安装配置 python 3.5.2, ipython 5.1.0, jupyt

Tornado源码分析 --- Cookie和XSRF机制

Cookie和Session的理解: 具体Cookie的介绍,可以参考:HTTP Cookie详解 可以先查看之前的一篇文章:Tornado的Cookie过期问题 XSRF跨域请求伪造(Cross-Site-Request-Forgery): 简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品).由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行.这利用了web中用户身份验证的一个漏洞:

tornado系列五:cookie安全

1.通过签名防止cookie篡改 import tornado.httpserver import tornado.ioloop import tornado.web import tornado.options from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int) class MainHandl

Go Web:Cookie

Cookie用来解决http协议无状态的问题. 首先,在服务端生成Cookie,然后在http响应header中设置Set-Cookie字段,客户端会读取到Set-Cookie字段后,会将cookie信息存储起来,下次继续访问服务端时,会在http请求中设置Cookie字段并发送给服务端,服务端可以解析这个Cookie字段,从而知道这个客户端之前已经和自己有过会话(上下文),然后再执行相应的逻辑代码. Cookie分为两种类型:session cookie和persistent cookie.