文档章节

那些年,我们踩过的技术坑汇总

silence88
 silence88
发布于 2017/04/06 17:52
字数 1031
阅读 52
收藏 2

1、GET请求URL带中文参数乱码问题。

我们开发中可能会遇到这样的问题:例如和其他系统对接,其他系统会通过http的get请求同时带一些参数请求你的接口地址(类似于支付宝回调等)。如:http://xxx.com/xxxAction/notifyResult?param=xxxxxx。

如果param需要传递中文,这时候通知的那边一般会将中文的参数值做urlEncode之后再传递过来,一般会选择用UTF-8做编码,这时候param带过来的就是结果UTF编码之后的值。当这个url请求到我们服务器的时候,我们服务器会默认对中文的参数进行解码操作,而这个解码具体按照什么方式解码,直接会导致传递过来的中文是乱码的。例如:tomcat8以下的版本默认中文的解码格式都是ISO-8859-1,因此传递过来的中文参数就会出现乱码,因为编码是按照UTF-8,解码不是按照UTF-8。必定造成乱码的现象。

神坑重现:

  • params传递的中文内容是:你好。经过UTF-8编码之后get方式请求服务器

  • 调试代码:我们发现拿到的request就成了一堆的乱码。

那么如何解决这样的问题呢?

方式一:代码介入:

思路:既然拿到的值是经过ISO-8859-1解码的,则可以将这个字符串按照ISO-8859-1编码,然后再对参数进行UTF-8解码即可。

或者:

方式二:修改容器默认的解码方式

这个配置在:xxx/conf/server.xml中。添加:URIEncoding="utf-8"

问题衍生:

通过浏览器请求一个带有中文参数的url,浏览器默认会对中文进行编码,而具体的编码方式会因为每个浏览器不同而不同,因此在实际的开发中,url尽量要做urlencode!避免不同浏览器不同的编码方式造成编码混乱的局面。

2、当需要将一个存放了字符串的集合转换为一个以逗号分隔的字符串时,切勿偷懒使用集合的toString方法,然后截取掉“[”、“]”的方式获取,因为list的toString()元素中间是用的逗号加空格隔开的,多了空格。

解决办法:

1、使用apache的StringUtils.join方法。

2、java8可直接使用String的join方法。

3、Fastjson序列化内部类失败问题。

我们在某个vo里面有一个其他类的字段,而又不想重新写一个类文件,则会直接在需要这个类的地方定义使用内部类,这里我们有一个json格式的字符串,现在需要利用fastjson转换为内部类的一个对象。错误代码如下:

@Data
public class Outer {

    private String name;
    private Inner value;

    @Data
    public class Inner{
        private String key;
        private String info;
    }

    public static void main(String[] args) {
        String json = "{\" info \":\" info \",\" key \":\" key \"}";
        Outer.Inner inner = JSON.parseObject(json, Outer.Inner.class);
        System.out.println(inner);
    }
}

错误console:

错误原因:

内部类没有顶一个为static,这样在实例化内部类的时候,需要事先实例化好外部类,根据外部类的一个对象才能实例化一个内部类,例如实例化内部类的写法如下:

Outer.Inner inner1 = new Outer().new Inner();

定义成静态内部类的写法为:

Outer.Inner inner1 = new Outer.Inner();

4、Collections.emptyList()方法返回的集合只能作为返回一个size为0的集合用,切不可以做其他修改集合的操作。

错误代码示例:

        List<String> list =  Collections.emptyList();

        list.add("sss");

        System.out.println(list);

错误Exception:

错误原因:

分析源码,这个方法实际返回的是一个类型为EmptyList的集合,而这个集合只是实现了几个简单的判断方法,并没有实现集合修改的一些方法,没有实现默认会使用AbstractList的方法,AbstractList并没有对修改集合的方法提供逻辑实现,只是简单地抛出了UnsupportedOperationException。

EmptyList类源码:

AbstractList的add方法源码:

© 著作权归作者所有

silence88
粉丝 8
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

silence88
silence88

引用来自“cnbo”的评论

坑还能不能多点
欢迎补充
cnbo
cnbo
坑还能不能多点
福利 | 书山有路“坑”为径,据说你踩过的坑可以换书!

作为一名程序员,最苦逼的是什么? 没错……就是一脸懵逼地踩上了各种光怪陆离的坑! 说起那些年我们踩过的坑,可谓是多种多样:有一不小心格式化后整个集群不可用的;有手残delete却无法撤销...

2018/04/20
0
0
技术干货+生日蛋糕+动手实践,尽在Docker 4周年生日会!

Docker 4岁啦!沿袭惯例,今年的3月13日-19日被定为Docker的生日周,在这一周,全球的Docker爱好者都会参与到Docker线下的生日会种。作为Docker老司机,网易云将在杭州为Docker庆祝四周岁的生...

网易云基础服务-蜂巢
2017/02/28
15
0
技术干货+生日蛋糕+动手实践,尽在Docker 4周年生日会!

Docker 4岁啦!沿袭惯例,今年的3月13日-19日被定为Docker的生日周,在这一周,全球的Docker爱好者都会参与到Docker线下的生日会种。作为Docker老司机,网易云将在杭州为Docker庆祝四周岁的生...

网易云基础服务-蜂巢
2017/02/28
0
0
腾讯IVWEB团队:那些年我们踩过的坑

腾讯云技术社区-简书主页持续为大家呈现云计算技术文章,欢迎大家关注! 作者:梁伟盛 那些年我们踩过的坑 事件背景 有一天leader给程序员cover分配了一个需求,cover一看,需求很简单嘛,就...

2017/12/18
0
0
那些年,我们经历过的 Java 事儿

温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋、,纠错。   在编程这条路上走的越久,我们遇到的事情就越多,磕磕绊绊在所难免,很多坑...

qq_35246620
2017/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java8

package com.shi.lambda;import java.util.Arrays;import java.util.List;import org.junit.Test;import com.shi.model.Employee;/** * 初始化案例 * @author xiaosh......

小小小施爷
10分钟前
0
0
c# 动态编译代码

static void Main() { Stopwatch watch = new Stopwatch(); watch.Start(); //创建一个CSharp语言Provider //CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CShar......

朝如青丝暮成雪
10分钟前
0
0
好程序员技术分享html5和JavaScript的区别

好程序员技术分享html5和JavaScript的区别,HTML5广义上讲是前端开发学科的代名词,包含HTML5、CSS3及JavaScript三个重要的部分,是运行在浏览器上应用的统称。如PC端网站、管理系统、手机网...

好程序员IT
13分钟前
0
0
tomcat 与 spring boot 设置虚拟路径

tomcat 设置虚拟路径 <Context path="/uploadDir" docBase="/data"/>path是请求访问的路径docBase是服务器存储文件的路径,Linux 根目录下 data spring boot 虚拟路径设置 registry.addRe......

kdy1994
16分钟前
0
0
var ,let ,const 的区别和共同点

一、let和var区别 1.关于变量提升,var能变量提升,let不能 // 关于var 如下所示console.log(a); //输出undefined,此时就是变量提升var a = 2; console.log(a); //2 //相当于下面...

MrBoyce
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多