request.setCharacterEncoding 关于编码 概述

2023-11-12

request.setCharacterEncoding 关于编码

 

概述
从Servlet2.3开始,支持客户端内容协商。服务端内容协商,很早就有,服务端在返回的数据中通过Content-Type来指定返回的数据内容。在REST叫嚣的背景下,客户端也需要协商:例如通过PUT方法提交一段XML或JSON数据来更新服务端的一个对象。客户端可通过URL后缀名.xml或.json的方式来告诉服务端提交的数据类型;也可通过HTTP头的Content-Type来告之服务端提交的数据类型。

 

关于该问题的Blog

【1】给出了两个办法

http://forum.springsource.org/showthread.php?t=14063

Hi,
I am woking on a site that receives input in CJK .
This may be a naive  question:
I am using org.springframework.web.servlet.DispatcherServlet as my servlet and I need to set CharacterEnconding on the HttpServletRequest.
I looked into the source code and I relaized there is no code that calls setCharacterEncoding

I dig into the forum and found 2 solutions:

1. Use the CharacterEncodingFilter

2. Override DispatcherServlet.doService  as:

public class MyServlet extends DispatcherServlet {
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding( "UTF-8" );
super.doService( request , response ) ;
}
}

I tried to do #1 for it seems to be more desirable (cleaner) solution.
in web.xml I added:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFi lter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

But it doesn't seem to work.
Could someone tell me how to do that? Use CharacterEncodingFilter?
Thanks in advance.

 

【2】注意事项

http://www.junlu.com/msg/125726.html

With the 2.3 servet API, there is a new method:
 request.setCharacterEncoding(String encoding)
通过Content-Type告诉服务端当前请求编码:
This lets you tell the server a request's character encoding.
(例如HTTP头: Content-Type:    text/html; charset=UTF-8
Content-Type:application/x-www-form-urlencoded; charset=UTF-8)

It is critical that  setCharacterEncoding is called BEFORE any
request.getParameter is called (or getReader). Otherwise, you are at the
mercy of the appserver for what you get back on the getParameter call.

For example, if setCharacterEncoding is not called, you could get a null
value back on getParameter("foo").

 

 

解决该问题:客户端协商编码方式

客户端协商http请求编码方式代码   收藏代码
  1. private String negotiateCharacterEncoding(HttpServletRequest request,Map<String,String> outParam) {  
  2.         String clientEncoding = request.getCharacterEncoding();//HTTP标准:客户端声称的编码(但是目前大多数浏览器并未实施该标准)  
  3.         outParam.put("point","HTTP标准");  
  4.         //协商过程:  
  5.         //1. 通过HTTP标准指定客户端编码;(在HTTP头中设置:Content-Type    =[text/html; charset=UTF-8])  
  6.         //2. 通过自定义HTTP头(Client-Charset)指定客户端编码;  
  7.         //3. 通过自定义HTTP查询参数(Client-Charset)指定客户端编码(只针对HTTP-GET方法)。(以免动态script标签发起请求时设置不了HTTP头;编码数值都是英文字符,提取编码数值跟编码无关。)  
  8.         //4. 如果所有的协商都没有,那么服务端强制使用配置:defaultEncoding  
  9.         //5. 如果服务端没有配置defaultEncoding,那么使用容器默认的ISO-8...(如果上述指定的编码不被支持,那么依然使用容器默认的)  
  10.         if(clientEncoding==null || clientEncoding.trim().equals("")) {  
  11.             clientEncoding = request.getHeader("Client-Charset");  
  12.             outParam.put("point","自定义HTTP头");  
  13.             if(clientEncoding==null || clientEncoding.trim().equals("")) {  
  14. //              clientEncoding = request.getParameter("Client-Charset");//不能通过该方式提取Client-Charset参数  
  15. //request.setCharacterEncoding(encoding);发挥作用的前提是:调用setCharacterEncoding之前不能执行任何request.getParameter  
  16.                 if("GET".equalsIgnoreCase(request.getMethod())) {  
  17.                     String queryString = request.getQueryString();  
  18.                     if(queryString!=null && !queryString.equals("")) {  
  19.                         //定位参数[Client-Charset]的起始和终止位置  
  20.                         int startIndex = queryString.indexOf("Client-Charset=");  
  21.                         int endIndex = -1;  
  22.                         if(startIndex!=-1) {  
  23.                             startIndex = startIndex+"Client-Charset=".length();  
  24.                             endIndex = queryString.indexOf("&", startIndex);  
  25.                             if(endIndex==-1) {//Client-Charset是最后一个参数  
  26.                                 int sessionidIndex = queryString.indexOf(";", startIndex);//去掉基于URL的SessionID  
  27.                                 if(sessionidIndex!=-1) {  
  28.                                     endIndex = sessionidIndex;  
  29.                                 } else {  
  30.                                     endIndex = queryString.length();  
  31.                                 }  
  32.                             }  
  33.                         }  
  34.                         if(startIndex<endIndex) {  
  35.                             clientEncoding = queryString.substring(startIndex, endIndex);  
  36.                             outParam.put("point","自定义HTTP查询参数");  
  37.                         }  
  38.                     }  
  39.                 }  
  40.             }  
  41.             if(clientEncoding==null || clientEncoding.trim().equals("")) {  
  42.                 clientEncoding = defaultEncoding;  
  43.                 outParam.put("point","服务端配置");  
  44.             }  
  45.               
  46.         }  
  47.         return clientEncoding;  
  48.     }  

 

设置编码方式代码   收藏代码
  1. if (encoding != null) {  
  2.             try {  
  3.                 request.setCharacterEncoding(encoding);//注:被强制认为是GBK编码,好处在于客户端在提交GET请求时不再需要做URLEncode处理了。不好的是,如果客户端提交以UTF-8的编码,则编码出错了。  
  4.                 //http://www.junlu.com/msg/125726.html  
  5.             } catch (Exception e) {  
  6.                 log.error("Error setting character encoding to '" + encoding  
  7.                         + "' - ignoring.", e);  
  8.             }  
  9.         }  
 

测试用例

/modifyListener_test.htm?nick=繁體昵稱衝頂&mobile=13812345678
/modifyListener_test.htm?nick=%B7%B1%F3%77%EA%C7%B7%51%D0%6E%ED%94&mobile=13812345678&Client-Charset=GBK
/modifyListener_test.htm?nick=%E7%B9%81%E9%AB%94%E6%98%B5%E7%A8%B1%E8%A1%9D%E9%A0%82&mobile=13812345678&Client-Charset=UTF-8


/modifyListener_test.htm?nick=涛&mobile=13812345678
/modifyListener_test.htm?nick=%CC%CE&mobile=13812345678&Client-Charset=GBK
/modifyListener_test.htm?nick=%CC%CE&mobile=13812345678
/modifyListener_test.htm?nick=%E6%B6%9B&mobile=13812345678&Client-Charset=UTF-8
/modifyListener_test.htm?nick=%E6%B6%9B&mobile=13812345678  //出错:输入是UTF-8,却被服务器强制为GBK (###nick=娑?,mobile=13812345678)
/modifyListener_test.htm?nick=%E6%B6%9B&mobile=13812345678&Client-Charset=UTF-8;12345
/modifyListener_test.htm?Client-Charset=UTF-8&nick=%E6%B6%9B&mobile=13812345678;12345 //nick=涛,mobile=13812345678;12345


/modifyListener_test.htm?nick=%E6%B6%9B&mobile=13812345678
并设置包头:
Content-Type:    text/html; charset=UTF-8

Content-Type:    charset=UTF-8
//协商或配置的编码:UTF-8,协商源:HTTP标准

 

问题答复:

Passport有一个全局的Filter,强制所有的HTTP请求的编码为GBK,所以支持不了URLEncode(UTF-8)。我想了这么些办法,都不行:
1、    把这个全局的Filter去掉,不强制为GBK,现有线上的那些没有编码的东西支持不了。
这样设置,对于那些没有编码的数据,比如:http://localhost/modifyListener_test.htm?nick=繁體昵稱衝頂&mobile=13812345678 提取的nick则会出错。因此会影响线上其他地方。

2、    手动从GBK再转UTF-8,部分数据能支持,有些不支持。(GBK和UTF-8字符集毕竟不是包含与被包含的关系,其中有冲突的部分)
New String(nick.getBytes(“GBK”),”UTF-8”)  对于http://localhost/modifyListener_test.htm?nick=繁體昵稱衝頂&mobile=13812345678能转换出“繁體昵稱衝頂”;但对于
http://localhost/modifyListener_test.htm?nick=涛&mobile=13812345678  其中“波涛”的“涛”则转换失败。

现在一个可行的解决办法是通过HTTP头协商,需要麻烦你那边在请求中加一个参数:
1、    在HTTP头部增加参数:Content-Type,并设置数值:charset=UTF-8   (备注:在HTTP头里设置Client-Charset参数,数值为UTF-8也行。但前提是Content-Type没被设置为其他)
这样设置后,nick就可以支持URLEncode(UTF-8)了。


2、    对于动态script标签的请求,由于无法设置HTTP头,后台支持查询参数:Client-Charset
比如:这样提交HTTP请求:  nick=%E6%B6%9B&mobile=13812345678&Client-Charset=UTF-8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

request.setCharacterEncoding 关于编码 概述 的相关文章

  • 将文件编码为 Base 64 Nodejs

    我使用下面的代码将文件编码为 Base64 var bitmap fs readFileSync file return new Buffer bitmap toString base64 我认为在文件中我们有问题 and 字符 但它很好
  • 在 C# 中追加到空字符串是如何工作的?

    我很惊讶地看到一个字符串被初始化为 null 然后在生产环境中附加一些内容的示例 只是闻起来不对劲 我确信它会抛出空对象异常 但这个大大简化的示例也有效 string sample null sample test sample equal
  • 将十六进制字节数组解码为特定代码页在随后编码时会产生错误结果

    我创建了一个简单的应用程序 如下所示 String stringValue new String new byte 0x00 0x00 0x00 0x25 273 byte valueEncoded Arrays copyOfRange s
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • pandas 使用查询功能检查列是否为空

    我有 pandas 数据框 我想在它的查询函数上执行 isnull 或 not isnull 条件 如下所示 In 67 df data pd DataFrame a 1 20 None 40 50 In 68 df data Out 68
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 如何让 XSLT 在 Java 中返回 UTF-8

    我正在尝试让我的 XSL 脚本使用 UTF 8 编码 像 和希腊字符这样的字符就像垃圾一样出现 让它工作的唯一方法是将结果写入文件 如果我将它写入输出流 它只会返回垃圾 System out 有效 但这可能是因为它被重定向到文件 结果需要从
  • 位置:固定在 iPad 和 iPhone 上不起作用

    I have been struggling with fixed positioning in iPad for a while I know iScroll http cubiq org iscroll and it does not
  • 使用 EntityFramework 使用空参数值调用存储过程

    我在 sqlserver 2008 上有一个存储过程 其中一个参数接受空值 我不知道如何使用参数上的空值来调用该 SP 为了获得更多上下文 我正在使用 EntityFramework 6xx 在下一个示例中 参数 status Compat
  • Android Activity 重新创建自身

    我的应用程序通常运行得很好 直到我在特定设备上遇到奇怪的问题 App中有2个活动 当我在 ActivityA 内启动 ActivityB 后 ActivityA 启动时没有问题 但是 当我通过按下硬件按钮或调用 finish 返回 Acti
  • Android 4 上的 html5 视频:全屏播放然后重定向到另一个网页 - 不起作用

    我正在为 Android 4 智能手机设计一个 html5 页面 其中包含一个 3gpp 或 mp4 视频 打开时必须自动全屏播放 当视频结束时应该重定向到另一个网址 一些谷歌搜索告诉我 Android 4 上不再允许自动播放 因此我选择显
  • 钛金 Android 导航组

    您好 我是钛合金新手 它允许开发人员创建跨平台应用程序 我需要创建一个适用于 Android 和 iOS 的导航组 有没有明确的解决方案 因为 Ti UI iPhone createNavigationGrou 仅适用于 iphone 谢谢
  • 如何删除非空约束?

    假设创建了一个表 如下所示 create table testTable colA int not null 您将如何删除非空约束 我正在寻找类似的东西 ALTER TABLE testTable ALTER COLUMN colA DRO
  • 黑色左/右三角形大小不同

    我使用黑色左指三角形 右左指三角形几何形状作为网站上的链接 并使用它们的 HTML 代码 和 9664 9654 由于某种原因 即使我在没有其他元素的空白页面上使用三角形 它们也不会以相同的大小显示 在 Chrome 上 向左指向的位置比向
  • Twitter Streaming API 使用的官方编码?是UTF-8吗?

    Twitter 流 API 的官方编码是什么 根据我所看到的 我最好的猜测是 UTF 8 但我想避免做出假设 我见过的 Twitter 网站上唯一暗示他们使用什么作为官方编码的部分是在这里 Twitter 不想因为我们使用 UTF 8 或相
  • Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) 不添加额外的编码提供程序

    我正在开发一个netcoreapp2 0控制台应用程序 我需要从 NET 访问整个编码包 我已经添加了System Text Encoding CodePages Version 4 4 0Nuget 包来自这一页 https www nu
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • 网络应用程序如何询问移动设备的位置?

    许多现代手机 谷歌Nexus等 都有某种内置的定位服务 当我访问某个网站 例如 google com 时 该网站会询问我是否愿意与该网站分享我的位置 您实际上如何要求移动设备向网站提供其位置 该位置以什么格式给出 我没有任何线索 也没有从谷

随机推荐

  • Java学习笔记

    public char charAt int index 根据索引返回字符 public int length 返回此字符的长度 数组的长度 数组名 length 字符串的长度 字符串对象 length StringBuilder Stri
  • 黑马程序员-微信小程序-Day3笔记(P38-P59)

  • CMD命令进入某个目录

    1 开始 gt 运行 gt CMD 2 进入某个磁盘 直接盘符代号 如D 不用CD 命令切换 3 进入除根录以下的文件夹 cd 文件夹路径 例如我要进入 E Program Files PHP 就 输入 E 回车 注 不 能在一打开CMD的
  • 折半查找不成功的平均查找长度怎么算_算法基础:常用的查找算法知识笔记

    1 查找表和查找效率的概念查找表是指由同一类型的数据元素构成的集合 分为静态查找表和动态查找表 1 1 静态查找表1 查询某个特定元素是否在查找表的集合当中2 查询某个特定元素的各种属性 1 2 动态查找表1 在查找表中插入一个数据元素2
  • 如何在命令行中使用 ftp 命令上传和下载文件

    转摘 https linux cn article 6746 1 html 本文中 介绍在 Linux shell 中如何使用 ftp 命令 包括如何连接 FTP 服务器 上传或下载文件以及创建文件夹 尽管现在有许多不错的 FTP 桌面应用
  • 音视频同步-时间戳

    媒体内容在播放时 最令人头痛的就是音视频不同步 从技术上来说 解决音视频同步问题的最佳方案就是时间戳 首先选择一个参考时钟 要求参考时钟上的时间是线性递增的 生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳 一般包括开始时间和结束时
  • vuejs+element UI table的常见的属性及事件

    一 table组件的方法 事件 查看官网 二 常用的事件 属性 一 属性 1 多选框 type selection 需要实现勾选的功能 在
  • BearPi-HM Micro 开发环境搭建

    1 资料下载 Ubuntu20 04 大小8G 下载地址 百度云 Ubuntu18 04 大小4 8G 下载地址 百度云 STM32CubeProgrammer JRE 虚拟机VMware Workstation MobaXterm工具 R
  • 华大(小华)HC32L130工程创建

    一 我们先来认识一下华大驱动库包下的文件功能 注意 华大提供的包是没有M0 内核标准文件的 HC32L130 是M0 ST提供的驱动库包是有的 就是CORE文件夹 第一步 创建文件夹目录 具体这个创建文件夹目录的含义可以看STM32工程创建
  • 梦幻可以在2个服务器无限转吗,如过能跨大区转服务器就好了

    前几天听个玩魔兽的朋友说 魔兽世界可以跨大区转服务器 不过需要一点手续费用 我大概记得他说要100元点卡钱 如果梦幻也能跨大区转服务器该多好 我有好多朋友在别的区玩 一直想叫我过去 可是我实在是不舍得现在满级满修的夫妻号 毕竟我和未婚妻辛辛
  • Python魔法方法之 __str__

    1 调用时机 使用print打印对象的时候会使用到 str 方法 例 print 对象 1 如果没有定义 str 方法 print 对象 则会打印对象的引用地址 2 如果自己定义了 str 方法 print 对象 则会打印方法的返回值 2
  • 计算机组成原理--基于Logisim的4位并行加法器实验的应用(超详细/设计/实验/作业/练习)

    目录 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Logisim的4位并行加法器实验 一 前言 二 环境与设备 三 内容 四 结果与分析 课程名 计算机组成原理 内容 作用 设计 实验 作业 练习 学习 基于Log
  • pytorch中model.eval的作用

    pytorch中model eval 的作用 问题描述 torch onnx export 导出onnx模型后 利用onnxruntime加载onnx模型后 其输出结果与原始 pth模型的输出结果之间存在很大的差距 通过拆分网络结构 定位到
  • 从pfn_to_page/page_to_pfn看linux SPARSEMEM内存模型

    转自 从pfn to page page to pfn看linux SPARSEMEM内存模型 温暖的电波 博客园 本文以arm64架构为背景 一 背景 计算机中的物理内存本来是没有没有页 page的概念的 Linux为了各种冠冕堂皇的理由
  • Spire.XLS 图表系列教程:C# 设置 Excel 图表坐标轴格式

    更多资源查看 Spire XLS工作表教程 Spire Doc系列教程 Spire PDF系列教程 下载Spire XLS最新试用版 默认情况下 创建图表时 Excel会自动设置其坐标轴属性 这些属性包括坐标轴选项 例如边界最大值 边界最小
  • python字符串大小写转换

    python中 为了方便字符串的大小写转换 为我们提供了三种方法 title lower upper python title 方法 title 方法用于将字符串中的每个单词的首字母大写 其他字母全部转换成小写 如果没有需要被转换的字符 那
  • 关于回文串的几种常见算法总结

    目录 一 判断字符串为回文串 二 查找字符串中有多少个回文子串 1 暴力枚举 2 中心扩展法 3 动态规划 4 Manacher 马拉车 算法 三 回文子串最大长度 一 判断字符串为回文串 回文串 字符串反转后和原字符串相同同 比如aba
  • 第二章 分类模型-决策树知识点详细总结

    机器学习算法系列 第一章 分类模型 逻辑回归知识点详细总结 第二章 分类模型 决策树知识点详细总结第三章 分类模型 随机森林知识点详细总结第四章 分类模型 支持向量机SVM知识点详细总结第五章 关联分析 apriori算法知识点详细总结 目
  • 无人机三维建模(3) 航拍实景模型

    本来以为我这个工作算是航拍测绘 结果发现 测绘是有严格规定的 参考 http bbs dji com thread 113513 1 1 html 首先 个人是不允许进行航拍测绘活动的 必须是以公司为单位来进行的 并且测绘公司的要求很高 比
  • request.setCharacterEncoding 关于编码 概述

    request setCharacterEncoding 关于编码 概述 从Servlet2 3开始 支持客户端内容协商 服务端内容协商 很早就有 服务端在返回的数据中通过Content Type来指定返回的数据内容 在REST叫嚣的背景下