頭大連續調試了兩天,一直報驗簽失敗,仔細看商戶傳回的原串和發送的原串是一樣的啊,本機調試(伺服器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)傳回給接口調用者,特别是調用者需要拿到你原串進行驗簽的情況。