一、request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值。

指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,Java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析提交内容,setCharacterEncoding()自然就无效。

get需在Tomcat的server.xml中的:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

URIEncoding="GBK" />

)加入URIEncoding="GBK",解决get请求乱码问题

客户端编码后,用该方法告知服务端,解码时使用相同的编码格式,否则会出现乱码。客户端一般编码()设置

<meta http-equiv="Content-Type" content="text/html; charset=gbk">    (post提交的form表单参数采用meta编码方式)

二、response.setContentType("text/html;charset=gb2312")是设置页面中为中文编码。(get中的QueryString参数用response中的contentType编码,如果没有采用meta编码)

前者是设置动态文字(参数,数据库),后者设置页面静态文字
response.setContentType指定 HTTP 响应的编码,同时指定了浏览器显示的编码. 
response.setCharacterEncoding设置HTTP 响应的编码,如果之前使用response.setContentType设置了编码格式,则使用response.setCharacterEncoding指定的编码格式覆盖之前的设置.与response.setContentType相同的是,调用此方法,必须在getWriter执行之前或者response被提交之前.

该方法是指定服务端编码格式,并告知客户端解码时的编码码格式,这样两者保持一致,才不会出现乱码。

三、post表单和get queryString编码设置

实践证明queryString只配置URIEncoding就可以,如果是pathInfo就需要配置useBodyEncodingForURI。关于queryString的编码有如下阐述:(引自http://blog.csdn.net/sfdev/article/details/3841719

对于Get方式的URL请求有两种情况,其一:用户直接在浏览器地址栏中输入URL,此时浏览器没有编码可参考,直接用浏览器的默认编码进行解析并提交到服务端;其二:在form表单内提交,只是form属性method为GET,此时浏览器会参考目前html中对编码的相关设置进行解析,比如content-type或meta中的charset。

以下就重点讲讲第二种方式的提交:
GET方式form submit:浏览器会对URL进行URL encoding,然后发送给服务器。

  • 对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo在URL Encoding时按照UTF-8编码;QueryString按照GBK编码。
    此时提交是:GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA
  • 对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString在URL encoding时按照GBK编码。
    此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA
  • 对于中文firefox、Chrome,因为没有类似IE中的这种设置选项,所以这两种浏览器中对pathInfo的编码规则没有做特殊处理,MS是和queryString采取同样的编码规则;在本例中的假设情况下:pathInfo和queryString在URL encoding时都按照GBK编码。
    此时提交是:GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA

很显然,不同的浏览器以及同一浏览器的不同设置,会影响最终URL中PathInfo的编码,该编码可能不会由我们应用来控制;对于queryString,则是可以由我们的应用来完全控制的,对于上面的事例:中文的IE和FIREFOX都是采用GBK编码queryString。

若调整下上例中的假设条件,设置Html内content-type或meta中的charset=UTF-8
此时在IE中queryString会按照UTF-8进行编码,即name=%E4%B8%AD%E5%9B%BD;
但是在非IE(Firefox、Chrome)中,此时提交时URL中会以中文直接提交,即name=中文;此时服务端的web服务器上肯定要进行相应的编码配置,否则肯定会出现乱码;

若设置Html内content-type或meta中的charset=ISO-5899-1
此时在IE、Firefox、Chrome中queryString都被用ISO-5899-1编码了,即name= %26%2320013%3B%26%2322269%3B;

response和request的setCharacterEncoding区别的更多相关文章

  1. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    这里先写几个大家容易搞混的编码设置代码: 在jsp代码中的头部往往有这两行代码 pageEncoding是jsp文件本身的编码contentType的charset是指服务器发送给客户端时的内容编码J ...

  2. request 和response 中的setCharacterEncoding区别

    response和request的setCharacterEncoding 一.request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值. 指 ...

  3. response和request

    请求响应流程图 response response是用来向客户端响应的对象! 需要回忆一下http响应内容: l  首行:状态码 l  响应头: 1头1值,1头多值: l  响应体(正文):html ...

  4. 浅谈response和request方法

    一:概述 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. 按这个理解的话一次请求生成一个request和res ...

  5. superagent和request结果转换区别

    superagent和request结果转换区别 使用superagent和request抓取页面内容时,两个抓取内容都可以被cheerio进行处理.但处理时有个细微差别. 1. 使用superage ...

  6. Servlet中response、request乱码问题解决

    Java Web(二) Servlet中response.request乱码问题解决   三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...

  7. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  8. response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...

  9. 2014-08-22 关于Response、Request等对象在cs文件中的使用

    今天是在吾索实习的第33天.已经有一段时间没写过博客了,今天突然想起个值得分享的东西,所以又华丽地回归了. 废话不多说了,直奔主题.我们会发现,在我们在cs文件中,直接使用Response.Reque ...

随机推荐

  1. Unity3d之Hash&Slash学习笔记之(二)--角色基础类的构建

    Hash&Slash学习笔记之(二)--角色基础类的构建 BaseStat类的构建 基本成员变量: _baseValue //基础属性值 _buffValue //增加的buff值 _expT ...

  2. jmeter测试java代码

    有时候总是要写代码的,不得不说你也得会,这不往下看 java请求了,就的写代码,那么先来实现一个类, package com.company.jemeters; public class Hello ...

  3. 大数据中Linux集群搭建与配置

    因测试需要,一共安装4台linux系统,在windows上用vm搭建. 对应4个IP为192.168.1.60.61.62.63,这里记录其中一台的搭建过程,其余的可以直接复制虚拟机,并修改相关配置即 ...

  4. Python练习——矩形、直角三角形、乘法表

    一.矩形 #******输入行和列,打印相应的矩形******# width = input("宽:") longth = input("长:") if (wi ...

  5. 解决ScrollViewer嵌套的DataGrid、ListBox等控件的鼠标滚动事件无效

    C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个DataGrid.ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果 ...

  6. 利用Elasticsearch搭建全球域名解析记录

    前言 数据来源,由Rapid7收集并提供下载https://scans.io/study/sonar.fdns 下载Elasticsearch 2.3 ElasticSearch是一个基于Lucene ...

  7. nodejs 搭建自己的简易缓存cache管理模块

    http://www.infoq.com/cn/articles/built-cache-management-module-in-nodejs/ 为什么要搭建自己的缓存管理模块? 这个问题其实也是在 ...

  8. JS中判断对象是不是数组的方法

    JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...

  9. C# Js 时间格式化问题

    C# 后台: .ToString("dd-MMM-yyyy", System.Globalization. DateTimeFormatInfo.InvariantInfo) eg ...

  10. 第三周vim入门学习2

    一.vim重复命令 1.重复执行上次命令 在普通模式下.(小数点)表示重复上一次的命令操作 拷贝测试文件到本地目录 $ cp /etc/protocols . 打开文件进行编辑 $ vim proto ...