zoukankan      html  css  js  c++  java
  • 用IHttpModule解决输入中文地址乱码问题(一)

    测试环境:

    服务器 —— [本机] WIindows2003 Enterprise Edition 2003 sp2  中文版本,IIS 6.0,IE 7.0,ASP.NET 2.0
    客户端 —— [本机] 同上,Firefox 2.0.0.12

    作者:birdshover

    本文是初步探讨文章。需要做一下几个假设:
    1、网站采用的是ASP.NET部署的;
    2、网站的编码是UTF-8的;
    3、修改页面链接是成本很小的。

    现在面临的主要问题是,页面内有很多链接,参数直接带的就是中文,这样比URL转码后的地址友好。但是,当甲用户把觉得不错的地址发送给好友乙时,问题,出现了,参数将会变成乱码!

    事实上在UTF-8环境下,网站上页面的链接是可以为中文的,例如:
    <a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>

    但是,复制“http://localhost/a.aspx?key=就是中文”直接敲入地址栏,将会产生乱码。

    本文旨在解决地址栏输入中文时出现的问题,这种处理方式简单,但是会与已有链接造成冲突。避免冲突的方法,比较复杂,后续文章将会介绍。

    利用.net httpmodule重写,可以解决以上问题。

    构造HttpModule如下:
        public class HookModule : IHttpModule
        {

            
    #region IHttpModule 成员

            
    public void Dispose()
            {
                
            }

            
    public void Init(HttpApplication context)
            {
                context.BeginRequest 
    += new EventHandler(context_BeginRequest);
            }

            
    void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication application 
    = (HttpApplication)sender;
                HttpContext context 
    = application.Context;
                
    string rawurl = context.Request.RawUrl;
                
                context.RewritePath(rawurl);
                
            }



            
    #endregion
        }

    配置完成后,在地址栏直接输入“http://localhost/a.aspx?key=就是中文”发现已经不产生乱码(IE,TheWorld 2.0)。

    但是当在Firefox中敲入以上地址时,发现还是变成了乱码。
    那是因为Firefox会强行给地址进行URL编码。把上述代码改造成:

        public class HookModule : IHttpModule
        {

            
    #region IHttpModule 成员

            
    public void Dispose()
            {
                
            }

            
    public void Init(HttpApplication context)
            {
                context.BeginRequest 
    += new EventHandler(context_BeginRequest);
            }

            
    void context_BeginRequest(object sender, EventArgs e)
            {
                HttpApplication application 
    = (HttpApplication)sender;
                HttpContext context 
    = application.Context;
                
    string rawurl = context.Request.RawUrl;
                
    byte[] bytes = System.Web.HttpUtility.UrlDecodeToBytes(rawurl, Encoding.Default);
                
    string s = Encoding.Default.GetString(bytes);
                context.RewritePath(s);
                
            }



            
    #endregion
        }

    OK,问题解决了,在三种浏览器中都实现了正常显示。

    看到这里不要结束,因为问题有可能已经产生了。

    你会发现点击<a href="http://localhost/a.aspx?key=就是中文">http://localhost/a.aspx?key=就是中文</a>
    这种地址时,反而变成了乱码。

    在本文中的解决方法是,把地址编码
    System.Web.HttpUtility.UrlEncode("就是中文",Encoding.GetEncoding("gb2312"))
    这样就没有乱码的问题了。

    注意,上述代码使用Encoding.Default是因为我的系统是中文版本的,因此默认编码就是gb2312.

    全文完。
    原文出自:http://www.cnblogs.com/birdshover/
  • 相关阅读:
    Spring MyBatis多数据源分包
    ubuntu Ngin Install
    Ubuntu16.04开启root用户,并远程登录
    ubuntu16.04LTS更换阿里源
    修改DIV滚动条样式
    Spring-Boot配置文件数据源配置项
    Springboot 版本+ jdk 版本 + Maven 版本的对应关系
    CAS配置(3)之restful-api接入接口
    Java.Cas4.0客户端接入配置
    Java.HttpClient绕过Https证书解决方案二
  • 原文地址:https://www.cnblogs.com/birdshover/p/1092737.html
Copyright © 2011-2022 走看看