天天看點

警惕HttpServletResponse.getWriter().println(result)換行的坑

     頭大連續調試了兩天,一直報驗簽失敗,仔細看商戶傳回的原串和發送的原串是一樣的啊,本機調試(伺服器tomcat)又不會報驗簽失敗的,測試環境(was)會報,後來仔細檢視封包原來傳回的封包多了個\n(調試的時候才能看到,日志裡面看不到\n)。導緻商戶拿到的原始封包和我們簽名的封包不一緻,那哪裡導緻會多一行呢,仔細看代碼,原來是HttpServletResponse.getWriter().println(result),傳回同步資料導緻的坑,println和print的差別就是多了一行。看源碼:

    public void println(String x) {

synchronized (lock) {

    print(x);

    println();

}

    }

  public void println() {

newLine();

    }

   private void newLine() {

try {

    synchronized (lock) {

ensureOpen();

out.write(lineSeparator);

if (autoFlush)

    out.flush();

    }

}

catch (InterruptedIOException x) {

    Thread.currentThread().interrupt();

}

catch (IOException x) {

    trouble = true;

}

    }

是以大家得謹慎,今後盡量使用HttpServletResponse.getWriter().print(result)傳回給接口調用者,特别是調用者需要拿到你原串進行驗簽的情況。