• GET方式提交中文编码问题以及三种解决方式


      GET方式提交在WEB中是非常常用的方式,有时候我们在使用GET方式提交请求不得不提交中文,但是TOMCAT等容器对于GET方式的编码问题总是让人折腾。

      先说说流程吧:

        我们的内容使用GET方式发送,就会在URL后面带上内容,在游览器发来的请求经过了游览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码,并且使用"iso8859-1"进行编码,因为传输过程是二进制的。

      这时候想解决中文编码问题有三种方式

        假设:

        url:http://localhost:8080/test?name=测试

        一、在服务器进行处理

          得到的内容是"iso8859-1",使用

            String str = new String(name.getByte("iso8859-1"),"utf-8");

          得到正确的值。

          ps:这种方式有个缺点;这种方式服务器必须默认使用iso8859-1的方式编码,如果我在TOMCAT更改默认的iso8859-1为utf-8,那么这种方式就无法生效了。

        二、在TOMCAT配置文件中设置

          在TOMCAT的目录下conf/server.xml中,搜索"8080"端口,如果改了端口按端口号搜索,搜到之后在这个标签中空格输入 URIEncoding="UTF-8" ,它默认是iso8859-1。

          ps:这种方式缺点显而易见,换了服务器就要更改,有时候忘记也是很常见的事情。

        三、手动编码多一次

          游览器和服务器传输都是先编码后解码,对中文的支持不太好,那么能不能把中文事先转换成英文或数字传输呢?

          假设:

            1、name=测试,在JS标签中,使用encodeURI(param)方法先将“测试” 转成 name=%26%92(瞎编的)  游览器再自动进行URI编码 name=%2525%2592(%的URI编码为%25);

              ognl表达式中,使用<s:param name="name" value="%{@java.net.URLEncoder.encode(name,'utf-8')}"> 对值进行URI编码,同时在struts2配置文件中开启静态方法的支持 java.net.URLEncoder.encode()。

              struts.xml: name="struts.ognl.allowStaticMehtodAccess" value="true"

            2、这时候将这链接GET方式提交了

            3、服务器那边得到 name=%26%92 ,我们再使用URIDecoder.decode(name,"utf-8"); 进行解码,这样就得到了“测试”

          PS:这种方式是不是比较好,不依赖TOMCAT

        

  • 相关阅读:
    Java 集合(静态导入)
    Java 集合 (Collections、Arrays)
    Java 异常
    Java 多态
    Java 继承

    内网服务器配置访问公网
    替换centos的原生yum源为阿里云yum源
    centos7安装杀毒软件ClamAV
    linux程序名称带devel跟不带的区别
  • 原文地址:https://www.cnblogs.com/zengyufei/p/4456472.html
Copyright © 2020-2023  润新知