码迷,mamicode.com
首页 > 其他好文 > 详细

记录一下我的排查问题过程实例

时间:2017-07-12 15:27:05      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:成就感   cat   过程   ima   equal   user   for   函数   自己的   

其实实习这么久,花最多时间还是在排查自己代码出的问题上面去。

其实也没有什么统一的方法,我自己也不喜欢断点调试。

总结一点:认真看报错和日志!然后一层一层寻找问题所在。

感觉就像在玩侦探破案游戏一样,找到了问题并且解决是很有成就感的(我并不是QA哈哈)

记录一下自己出的bug

 

1、数据库

感觉数据库的问题,报错都挺明显的,只不过很长,注意看就行了。

{
   "isError": true,
   "message": "\n### Error updating database.  Cause: java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1\n### The error may involve defaultParameterMap\n### The error occurred while setting parameters\n### SQL: INSERT INTO t_appoint(mis_id,serial_number,appoint_time,slave) VALUES (?,?,?,?)\n### Cause: java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1\n; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1366]; Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1; nested exception is java.sql.SQLException: Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1",
   "data": null
}

一开始以为test08有什么问题,但是仔细看,发现是“ Incorrect integer value: ‘test08‘ for column ‘slave‘ at row 1”

意思是slave的属性是int的,但是你插入了一个test08字符串。所以我们只要去数据库把slave的属性改了就好。

 

 

2、服务器没有返回数据。

技术分享

 

服务器没有返回数据(正常情况下,出错or正常都会返回数据的),但是前端200啊。怎么回事呢?

看服务器的logger,根本没有打印出这次访问。(如果有请求,服务器无论接受与否,都会打印这次访问的info)。

那就有一个猜想:被拦截器拦截下来了。

怎么回事呢?这就要靠自己去仔细阅读项目里面前辈们写的拦截器代码了。spring下都是继承HandlerInterceptorAdapter类再自己实现的。

 

我的请求路径是/appoint/xxxxxxx

以下是拦截器代码。

 

阅读的过程和思考写在了注释里面

 

     String method = request.getMethod().toUpperCase();

    //我的请求是post方法,所以这个filter肯定是false boolean filter = "GET".equals(method) || "HEAD".equals(method) || "OPTIONS".equals(method); String uri = request.getRequestURI(); uri = URLDecoder.decode(uri, URI_CHARSET); User user = userService.getCurrentUser(); String name = null;
       //我自己的路径在配置里面是不用走登陆的,所以用户肯定是null,这部分跳过即可。 if (user != null) { ...... } if (name != null && !uri.startsWith("/static/")) { ...... }
    //上面说了filter是false,这里可以跳过了 if (filter) { return super.preHandle(request, response, handler);//true }

    //只有这个可能了,仔细看,我的请求开头是appoint,所以进到第二个if if (uri.startsWith("/ba/")) { return checkBaseAuth(request, response); } else if (uri.startsWith("/ci/") || uri.startsWith("/safety/") || uri.startsWith("/api/") || uri.startsWith("/appoint/")) { return checkLAN(request);//跳到这里 } else { return checkXSRF(request, user); }

  

//这个函数是拦截ip,看看请求的ip,在不在非拦截的ip里面。非拦截表在下面。
private boolean checkLAN(HttpServletRequest request) { String host = request.getRemoteHost(); for (String ip : EXCLUDE_IP) { if (host.startsWith(ip)) { return true; } }


//我起的是本地服务。localhost:8080/appoint/xxxxx,而127.0.0.1也在不拦截的名单里面。
private static final String[] EXCLUDE_IP = {
"127.0.0.1", "211.151.229.", "58.83.134.", "58.83.142.",
"106.3.46.", "221.194.", "106.120.108.44", "172.24.35.16"
};

  

我就纳闷了!一路走下来没事啊。为什么会被拦截了呢?

于是我不信邪,加了一句打印日志,看看自己ip。

sLogger.info("host ip : {} ", host);

 

发现 

技术分享

好了,知道问题所在了。

 

localhost 解析为ipv4地址是127.0.0.1,解析为ipv6的时候,就是上面的0:0·······1。而0:0········1不在我们的不拦截表里面,所以被拦截下来了。

 

真是莫名其妙的问题啊??

 

记录一下我的排查问题过程实例

标签:成就感   cat   过程   ima   equal   user   for   函数   自己的   

原文地址:http://www.cnblogs.com/wzben/p/7155110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!