(java) - 感觉是见鬼了,超级灵异问题,请大家看看

ws-小铁匠 发布于 2015/06/25 14:38
阅读 870
收藏 0

开发环境:IntelliJ IDEA + maven + JDK1.8

先上代码,再说问题。这是一段springmvc拦截器的代码

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) throws Exception {
        String ticket = request.getParameter("ticket");
        if (StringUtils.isBlank(ticket)) {
            LogUtil.info(LOG, "请求无效,ticket为空");
            return false;
        }
        String id = AesUtil.decrypt(ticket);
        String signature = request.getParameter("signature");
        String nonce = request.getParameter("nonce");
        String timestamp = request.getParameter("timestamp");
        // 将公众号配置信息放到微信请求上下文
        Record record = publicAccount.findById(id);
        if(record.isEmpty()){
            LogUtil.info(LOG, "请求ticket无效");
            return false;
        }
        WxMpConfigStorage wxMpConfig = WxMpUtil.buildConfigStorage(record);
        String encryptType = StringUtils.isBlank(request.getParameter("encrypt_type")) ?
                "raw" :
                request.getParameter("encrypt_type");
        WxMpXmlMessage inMessage = null;
        if ("raw".equals(encryptType)) {
            // 明文传输的消息
            inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
        } else if ("aes".equals(encryptType)) {
            // 是aes加密的消息
            String msgSignature = request.getParameter("msg_signature");
            inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(),
                    wxMpConfig, timestamp, nonce, msgSignature);
        }
        WechatContext.setInMessage(inMessage);
        WechatContext.setInMessageRecord(record);
        WechatContext.setWxMpConfigStorage(wxMpConfig);
        WechatContext.setEncryptType(encryptType);
        // 测试环境不做签名校验
        if (AppConfig.isTest()) {
            LogUtil.warn(LOG, "测试环境不做签名校验");
            return true;
        }
        WxMpService wxMpService = WxMpUtil.getWxMpServiceByConfig(wxMpConfig);
        if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
            // 消息签名不正确,说明不是公众平台发过来的消息
            LogUtil.error(LOG, "消息签名不正确,非法请求");
            return false;
        }
        return true;
    }



问题1
程序不加断点时正常执行,没有异常,但是加了断点后报了莫名其妙的异常


异常信息:

实在匪夷所思,我并没有在项目中使用ehcache


问题2
在上述代码中

inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
将inputstream解析xml出现异常, inputstream里没有数据


但是,如果我在前面加了断点,一步一步往下调试的时候,居然能够正确解析,并且是第一次发起请求的时候有数据,之后的请求无论有没有加断点都解析不到数据,

(断点位置)


(执行到这里的时候,数据可以正常解析)

妈蛋,这彻底颠覆了我对程序的理解啊,折腾了两天,找不到问题所在,是IDE的问题???



加载中
0
itkang
itkang

你的代码jdk版本是多少?//容器的jdk版本是多少?

0
battyman
battyman
看调试窗口的线程列表里面出现了哪些线程,IDE中的端点其实并不能反映程序运行的真实情况
0
梅开源
梅开源
用NetBeans试试
0
杨延庆
杨延庆
同步和异步的问题吧,你用断点的话是同步操作
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部