cookie的中文乱码问题【URL编码解码】
先搞明白为什么会乱码,为什么要转码:
在tomcat 8 之前,cookie中不能直接存储中文数据。需要将中文数据转码,一般采用URL编码(%E3)。
在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持(比如空格),建议使用URL编码存储,URL解码解析。
编码解码前后字符如下表所示:
| 编码前 | 十进制数字、汉字 |
| 编码后 | 十六进制数字、英文 |
| 解码前 | 十六进制数字、英文 |
| 解码后 | 十进制数字、汉字 |
浏览器与服务器交互过程如图所示:

实例代码如下:
servlet中,URL编码解码的的主要代码如下:
import java.net.URLDecoder;
import java.net.URLEncoder;
//--------省略若干代码----------- String str_date = sdf.format(date);//获取当前时间
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date); //--------省略若干代码----------- String value = c.getValue();//获取cookie的value
System.out.println("解码前:"+value);
//URL解码
value = URLDecoder.decode(value, "utf-8");
System.out.println("解码后:"+value); //--------省略若干代码-----------
全部代码如下:
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Types
* @author dandelion
* @time 2019年3月7日上午10:03:02
* @作用 cookie记录上次访问时间
*/
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
boolean flag=false;//没有name是lastTime的cookie
Cookie[] cs = request.getCookies();
if(cs!=null&&cs.length>0){
for(Cookie c:cs){
String name = c.getName();
if("lastTime".equals(name)){
flag=true;//有name是lastTime的cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月dd HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
c.setValue(str_date);
c.setMaxAge(30);
response.addCookie(c);
//相应数据
String value = c.getValue();
System.out.println("解码前:"+value);
//URL解码
value = URLDecoder.decode(value, "utf-8");
System.out.println("解码后:"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间是:"+value+"</h1>");
break;
}
}
}
if(cs==null||cs.length==0||flag==false){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月DD HH:mm:ss");
String str_date = sdf.format(date);
str_date = URLEncoder.encode(str_date, "utf-8");
Cookie c = new Cookie("lastTime", str_date);
c.setMaxAge(300);
response.addCookie(c);
response.getWriter().write("<h1>欢迎你,这是你首次登录</h1>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
控制台输出如下:
编码前:2019年03月07 14:28:24
编码后:2019%E5%B9%B403%E6%9C%8807+14%3A28%3A24
解码前:2019%E5%B9%B403%E6%9C%8807+14%3A28%3A24
解码后:2019年03月07 14:28:24
浏览器显示如下:

说明:
日期:2019-03-07 14:35:24
cookie的中文乱码问题【URL编码解码】的更多相关文章
- 【转】asp.net Cookie值中文乱码问题解决方法
来源:脚本之家.百度空间.网易博客 http://www.jb51.net/article/34055.htm http://hi.baidu.com/honfei http://tianminqia ...
- java web url编码解码问题(下载中文名文件)
问题描述:需要url直接访问中文名的文件,类似于在地址栏里直接输入http://localhost:8080/example/丽江旅游攻略.doc 来进行文件下载,tomcat的server.xml文 ...
- WebApi中对请求参数和响应内容进行URL编码解码
项目经测试,发现从IE提交的数据,汉字会变成乱码,实验了网上很多网友说的给ajax加上contentType:"application/x-www-form-urlencoded; char ...
- sed处理url编码解码=== web日志的url处理
URL 编码/解码方法(linux shell实现),方法如下: 1.编码的两种方法: admin@~ 11:14:29>echo '手机' | tr -d '\n' | xxd -plain ...
- ASP.NET中Url编码解码
今天遇到Url编码解码的问题,纠结了一天的时间,结果上网一查才发现太二了我们. 同事写的代码把url用HttpUtility.UrlEncode编码和解码了,本地测试没有问题,部署到服务器上就提示转码 ...
- 解决Linux文档显示中文乱码问题以及编码转换
解决Linux文档显示中文乱码问题以及编码转换 解决Linux文档显示中文乱码问题以及编码转换 使vi支持GBK编码 由于Windows下默认编码是GBK,而linux下的默认编码是UTF-8,所以打 ...
- 编码解码--url编码解码
url编码解码,又叫百分号编码,是统一资源定位(URL)编码方式.URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通 ...
- Delphi中处理URL编码解码
Delphi中处理URL编码解码 一.URL简单介绍 URL是网页的地址,比方 http://www.shanhaiMy.com. Web 浏览器通过 URL 从 web server请求页面 ...
- Python学习之==>URL编码解码&if __name__ == '__main__'
一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...
随机推荐
- java变量的作用域和基本数据类型转换
1.变量的作用域 赋值运算符 变量名 = 表达式 列: a = (b+3)+(b-1) 表达式就是符号(如:加号,减号)与操作数(如:b,3)的组合 自动类型转换(隐式类型转换):从小类型到大类型可以 ...
- java 线程操作
停止线程 创建“停止标记”,thread.interrupt() 准确的说interrupt()方法只是“告知线程该停止了”,而线程检查到该“告知”后,再通过其他的办法停止线程. 线程调用了inter ...
- LeetCode 81 搜索旋转排序数组II
题目: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在于 ...
- xenserver挂载新硬盘
注意:新加硬盘请不要加入raid,否则不认盘 一: 1.1:查看磁盘列表 fdisk -l [root@xenserver zz]# fdisk -l Disk /dev/sdb: 7999.4 GB ...
- C++遍历路径下的所有文件
intptr_t类型用于记录文件夹句柄,注意该类型不是指针类型,而是int型的重定义. _finddata_t结构体类型用于记录文件信息. _finddata_t结构体定义如下 struct _fin ...
- pass,break,continue的使用场景
# ### 关键字的使用 pass / break / continue # pass 过 起到占位的作用 if 5 == 5: pass print(123) # break 只能应用在循环当中 用 ...
- react native 环境报错
按照react native中文网的文档安装 1.brew 管理软件 2.node 在终端启动工程后就报下面这个错误 这个错误是在RN在第一次配置环境启动一个工程的时候 ,在这过程中下载的缓存文件不完 ...
- SIMTRACE环境搭建
搭建simtrace环境 工具环境搭建 仅作参考,具有时效性,请以官方文档为准. 跨平台编译工具arm-elf 参考链接:https://osmocom.org/projects/baseband/w ...
- Fibonacci Heaps
Mergeable heapsA mergeable heap is any data structure that supports the following five operations,in ...
- C++中多维数组传递参数
在c++自定义函数时我们有时需要传递参数,有时以多维数组作为参数,这里就遇到了多维数组该怎么传值的问题了,首先我们看看一维数组是怎么做的. void print_num(int num[], int ...