JavaEE细节问题03——关于服务器和浏览器的编码解码

Request——对于接受请求:

获取请求中的编码解码问题 :

对于post请求,浏览器会根据当前页面的编码来对字符进行编码,

所以我们 直接采用:

 request.setCharacterEncoding("UTF-8");

对于get请求,浏览器自动对字符进行iso-8859-1编码

所以我们拿到以后就要对其进行iso-8859-1解码,使其成为原本的字节数组,然后再进行utf-8编码 

        Enumeration<String> enums = request.getParameterNames();
        while (enums.hasMoreElements()) {
            String name = enums.nextElement();
            String value = request.getParameter(name);
            value = new String(value.getBytes("ISO-8859-1"),"utf-8");
            System.out.println(name+":"+value);
        }

Response——对于发出响应:

直接使用字节流不指定编码的话,服务器会默认使用系统编码进行编码,浏览器也会使用系统默认编码进行解码

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    OutputStream os = response.getOutputStream();
    os.write("我是好人".getBytes());//不指定编码的话将使用系统默认编码
}

=====浏览器正常显示====

使用字节流指定编码,并指定Http协议的相应信息,告诉浏览器用什么编码解析字节流

public void doPost(HttpServletRequest request, HttpServletResponse response)
    OutputStream os = response.getOutputStream();
    // os.write("我是好人".getBytes());//不指定编码的话将使用系统默认编码
    os.write("我也是好人".getBytes("utf-8"));//指定编码,指定编码之后一点要在响应头中指定浏览器解析的编码
    //response.setHeader("Content-Type", "text/html;charset=utf-8");
    response.setContentType("text/html;charset=utf-8");
    //上述两种都可以
}

使用字符流不指定编码的话,服务器会默认使用ISO-8859-1进行编码。

所以如果使用字符流传输汉字,一定要设置编码

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    //response.getWriter().write("我是好人");// 不行的,因为默认ISO-8859-1编码
    response.setCharacterEncoding("utf-8");//设置成utf-8编码
    response.setHeader("Content-Type", "text/html;charset=utf-8");
    response.getWriter().write("我是好人");
}

然后setContentType("text/html;charset=编码")有setCharacterEncoding和setHeader("Content-Type", "text/html;charset=编码")的效果

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    //response.getWriter().write("我是好人");// 不行的,因为默认ISO-8859-1编码
            /*
            response.setCharacterEncoding("utf-8");//设置成utf-8编码
            response.setHeader("Content-Type", "text/html;charset=utf-8");
            */
    response.setContentType("text/html;charset=utf-8");//这一句可以达到上面两句的效果
    response.getWriter().write("我是好人");
}
时间: 2024-10-14 00:42:34

JavaEE细节问题03——关于服务器和浏览器的编码解码的相关文章

Java网络编程 - 浅析web服务器与浏览器的实现原理

我们基本每天都在通过WEB浏览器,去浏览一些新闻,看看视频之类的. 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件. 那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与浏览器,基本的实现原理是什么样的呢? 首先可以明确的就是,例如我们所做的通过浏览器输入一个地址,访问一个网页的操作. 实际对应的底层操作简单来说就是:客户端(浏览器)面向于WEB服务器的网络通信. 那么

服务器与浏览器缓存协商控制机制的总结

http://www.ginano.net/browser-server-cache-control-rule 发表于2013 年 3 月 13 日由ginano 引子:昨天中文站出现了大量的用户投诉,投诉内容是运费发生变化,运费金额不正确.可是我们本地怎么测试都没有问题.但是考虑到问题唯一的可能是昨天的一个关于运费模版优化的项目引发的.因为,我昨天中午发布了一个style应用版本,发布时间是11点20分左右,运费模版优化项目的发布是在晚上9点钟左右.但是由于运费模版优化项目在正式发布阶段发现了

你不知道的 页面编码,浏览器选择编码,get,post各种乱码由来

asp.net页面编码和浏览器的选择编码 每个asp.net的写手都知道,在新版本的visual studio,在没有任何设置的情况下,新建页面时的默认编码位utf-8 我们可以从两个地方可以看出: 第一:打开aspx页面,“文件”->“高级保存选项”,如下图,可以看出编码为:Unicode(UTF-8带签名) 第二:找到aspx存放路径,用系统自带的文本编辑器打开,然后“文件”->"另存为",如下图,可以看出编码为UTF-8 很多时候我们有很多疑问,我们经常在aspx页面

浏览器因编码引起的缓存问题

测试 mysql_query  与 mysql_unbuffered_query的时间差问题的时候,做了一个简单的PHP连接mysql数据库的测试代码,文件编码是utf8,在chrome浏览器中,当把chrome浏览器的编码更改为utf8的情况下,刷新页面,获取的时间戳是不会改变的,在nginx服务器和代码之间找了很久也没发现问题,换成IE浏览器结果是好的.当使用chrome浏览器的编码浏览器默认打开的编码(页面的中文是乱码),则时间戳是会改变的.在PHP代码页面加上页面的编码,问题迎刃而解 p

服务器和浏览器交互过程

分析当前请求是那台虚拟主机 查看请求头中的Host请求头来分析 Host: localhost 如果没有Host访问缺省虚拟主机 分析当前请求是哪一个web应用 从请求行中的请求资源部分中得出当前访问的是哪一个web资源 GET /game/servlet/MyFirstServlet HTTP/1.1 分析当前请求访问的是这个web应用的哪个资源 GET /game/servlet/MyFirstServlet HTTP/1.1 查看web.xml的文件,查看有没有对应的虚拟路径,如果有则用这

JavaEE细节问题05——Cookie和Session

Cookie和Session的作用: 都是用于存储一些关键数据. Cookie和Session的存储位置: Cookie储存在客户端,Session储存在服务器 Cookie的产生和销毁以及原理: Cookie由服务器产生,通过HTTP协议发送给客户端. 在协议的响应头中的:Set-Cookie标注了这个cookie的信息: 下次如果有cookie带给服务器时,将会在 在协议的请求头中的:Cookie标注了这个cookie的信息: /*  * 正值表示 cookie 将在经过该值表示的秒数后过期

第03章 服务器细性能剖析

如何确认服务器达到了最佳性能状态,找出某条语句为什么执行不够快,找到服务器卡顿的问题 1 性能优化 性能测试并不会降低cpu利用率.而应该是测试应用大多数的时间花费在哪里,对这部分进行优化. 优化任务的执行时间,应该测试定位不同的子任务花费的时间,然后通过: 优化花费时间多的子任务 降低子任务的执行频率 2 性能剖析 1.1 通过性能剖析优化 性能剖析是测量和分析任务的时间花费在哪里的主要办法,通常步骤为: 测试任务所花费的时间 对结果进行统计和排序,将重要的任务排到前面 在任务开始时启动计时器

服务器获取浏览器发送请求中的cookies,选取自己需要的cookie

String cookieName = “userID”; // 设置自己需要的cookie名 Cookie cookies[] = request.getCookies(); // 获取请求中的所有cookie if (cookies!=null) { for(int i=0;i<cookies.length;i++) // 遍历 { Cookie cookie = cookies[i]; if (cookieName.equals(cookie.getName())) doSomething

Request 接收参数乱码原理解析二:浏览器端编码原理

上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“Content-Type: text/html; charset=gb2312”解码.修改web.config中“responseEncoding=utf-8”,发现服务器页面响应Header变成了“Content-Type: text/html; charset=utf8”. <system.web&g