Request 接收参数乱码原理解析三:实例分析
通过前面两篇《Request 接收参数乱码原理解析一:服务器端解码原理》和《Request 接收参数乱码原理解析二:浏览器端编码原理》,了解了服务器和浏览器编码解码的原理,接下来结合项目中遇到的具体问题,分析乱码问题的解决方法。
1.用户身份验证Cookie乱码问题
用户登录后,通常用Cookie记录身份,如把用户名记录到Cookie中,其它页面读取Cookie,对Cookie值验证,符合一定规则的话则认为是合法用户。
protected void Page_Load(object sender, EventArgs e)
{
//假定登陆用户名为北京(历史原因系统允许有中文名)
Response.Cookies["username"].Value = Server.UrlEncode("北京");
}
登陆成功记录Cookie
protected void Page_Load(object sender, EventArgs e)
{
//读取Cookie,如果用户名存在则认为登陆成功(实际验证比这要复杂很多)
string userName = Server.UrlDecode(Request.Cookies["username"].Value);
bool isLogin = userName == "北京";
Response.Write("用户" + userName + "登陆" + (isLogin ? "成功" : "失败"));
}
验证Cookie页面
因为用户名存在中文问题,写入编码和读取解码都是在服务器端进行的,所以写Cookie时将值用Server.UrlEncode()编码,读取Cookie值时用Server.UrlDecode()解码,通常认为这两个函数是成对出现的,都是由web.config中的globalization结点指定的。
这段代码绝大部分运行是没问题的,但遇到Post请求的AJax调用页面时,就出错了,得到的username值是乱码。通过前面两篇的分析可知:Ajax请求时,页面请求Header中加了“Content-Type: text/html; charset=utf8”,Server.UrlDecode()解码方式变成了utf-8,乱码自然产生了。问题解决方式是解码时指定编码方式,不要再用依赖于上下文的函数解码了,可以改为“HttpUtility.UrlDecode(Request.Cookies["username"].Value, System.Text.Encoding.GetEncoding("GB2312"))”。
<form id="form1" runat="server">
<div>
<input type="button" name="btnAjaxPost" value="AJax提交" onclick="Ajax()" />
<div id="divMessage" style="color: red"></div>
</div>
</form>
<script type="text/javascript">
function Ajax() {
$.ajax({
type: "POST",
url: "LoginValidateCookie.aspx",
data: { name: "name" },
success: function (data) {
$("#divMessage").html(data);
}
});
} </script>
Ajax Post请求示例
2.Url地址栏中的中文参数
有些页面地址,由于某些原因带了中文参数(如http://localhost:52443/Encode/EncodeTest.aspx?username=北京),而这些地址又可能已经被baidu等搜索引擎收录,因此不能单靠生成新地址规则方式解决,项目必须做到兼容带中文参数的地址。
如果是类似示例中的逻辑,中文参数为系统用户的用户名,则可以采用先用Request.QueryString方式获取,得到username如果在系统中存在,则认为得到的参数是正确的;如果username在系统中不存在,则认为可能是因为参数中文乱码原因引起的,再用NameValueCollection方式获取一次,解码方式和系统解码是不一样的(系统配置的是GB2312,则指定用utf-8解)。
string username = Request.QueryString["username"];
//如果通过Request方式获取参数乱码,则可以通过解析Request.Url.Query的方式获取参数
NameValueCollection parames = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.UTF8);
string username2 = parames["username"];

如果中文参数值是任意值,无法判断是正常值还是乱码,可能就要根据不同浏览器类型,判断用GB2312解码还是utf-8解码了。当然为避免不必要的麻烦,尽量url地址中不要含有中文参数(可通过编码来解决,工行网站就是这么干的,url中的中文用了utf-8编码http://www.icbc.com.cn/ICBC/%e5%ae%a2%e6%88%b7%e6%9c%8d%e5%8a%a1/%e7%83%ad%e7%82%b9%e9%97%ae%e7%ad%94/%e4%b8%aa%e4%ba%ba%e7%94%b5%e5%ad%90%e9%93%b6%e8%a1%8c/default.htm)。
Request 接收参数乱码原理解析三:实例分析的更多相关文章
- Request 接收参数乱码原理解析一:服务器端解码原理
“Server.UrlDecode(Server.UrlEncode("北京")) == “北京””,先用UrlEncode编码然后用UrlDecode解码,这条语句永远为true ...
- Request 接收参数乱码原理解析二:浏览器端编码原理
上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“C ...
- Request 接收参数乱码原理解析
起因: 今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: &l ...
- 详细解析ASP.NET中Request接收参数乱码原理
起因:今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: < ...
- Python实现的选择排序算法原理与用法实例分析
Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...
- 处理request接收参数的中文乱码的问题:
Ø POST的解决方案: * POST的参数在请求体中,直接到达后台的Servlet.数据封装到Servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-88 ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- RPC原理及RPC实例分析(转)
出处:https://my.oschina.net/hosee/blog/711632 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服 ...
- laravel 请求request 接收参数
获取请求输入 获取所有输入值 你可以使用 all 方法以数组格式获取所有输入值: $input = $request->all(); 获取单个输入值 使用一些简单的方法,就可以从 Illumin ...
随机推荐
- Linux初记
ctrl+u可以在shell下删除行,如果此键不起作用,就试试ctrl+x ctrl+z可以将程序挂起,不会终止程序,但可以将程序挂起. 通过fg命令可再把此作业切换到前台 cp命令的目标文件如果是一 ...
- dom4j解析xml的增加信息
想要在xml中增加信息,那么就要先找到你要加信息的节点 前三行是固定模式,主要是找到xml文件的地址,并且得到根节点,再从根节点中便利出来movie的所有节点之后用集合接收 SAXReader rea ...
- MyEclipse使用技巧
1. 大小写切换: Ctrl + Shift + X 大写: Ctrl + Shift + Y 小写: 2. 自动导包: Ctrl + Shift + O 3. 运行前自动保存 ...
- Oracle EBS进化史
https://blogs.oracle.com/ptian/entry/oracle_ebs%E8%BF%9B%E5%8C%96%E5%8F%B2 通过图表总结了下Oracle EBS的进化历史,回 ...
- iOS 直播类APP开发流程分解:
1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.C ...
- maven安装nexus私服
从nexus官网下载Nexus Repository Manager OSS 2.x的安装包:nexus-2.14.1-01-bundle.tar.gz,3.x版本需要jdk8及以上 解压 tar x ...
- App开发如何利用Fidder,在api接口还没有实现的情况下模拟数据,继续开发
相信app开发很多时候,都是等后台出接口,拿到数据调试错误.殊不知,我们完全可以不用等,只要有约定好的接口定义文档,借助工具就能做到,自己模拟数据返回~ 下面主要是在项目组开发过程中,使用F ...
- Websocket全讲解。跨平台的通讯协议 !!基于websocket的高并发即时通讯服务器开发。
本博文,保证不用装B的话语和太多专业的语言,保证简单易懂,只要懂JAVAEE开发的人都可以看懂. 本博文发表目的是,目前网上针对Websocket的资料太散乱,导致初学者的知识体系零零散散,学习困难加 ...
- QQ揭秘:如何实现托盘闪动消息提醒?【低调赠送:QQ高仿版GG 4.1 最新源码】
当QQ收到好友的消息时,托盘的图标会变成好友的头像,并闪动起来,点击托盘,就会弹出与好友的聊天框,随即,托盘恢复成QQ的图标,不再闪动.当然,如果还有其它的好友的消息没有提取,托盘的图标会变成另一个好 ...
- ZooKeeper学习第一期---Zookeeper简单介绍
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同 ...