2017-04-19 18 views
-1

我有兩個不同服務器上運行的相同Servlet。這兩臺服務器都是Linux Red Hat。是什麼導致Java Servlet僅使用LF或CRLF打印字符串

這個Servlet由一些shell腳本調用,它接收Servlet響應並用它做出一些決定。

問題是:Shell腳本對不同類型的斷線(LF或CRLF)非常敏感。在一個服務器中,Servlet的輸出帶有CRLF,而在另一個服務器中運行的Servlet的輸出只帶有LF。外觀:

服務器1:

0 \r \n 
31 0d 0a 

服務器2:

0 \n 
    30 0a 

這是打印出結果的servlet代碼的一部分:

Integer authorization = checkAuthorization(error_code, sat); 

if(authorization != null){ 
    out.println(authorization); 
} 

正如你所看到的,我從一個函數接收一個Integer,然後我打印它,僅此。

什麼可以證明不同服務器的不同輸出?有沒有任何環境變量來控制它?

+1

有一個平臺相關行分隔符的概念。請參閱http://stackoverflow.com/questions/207947/how-do-i-get-a-platform-dependent-new-line-character,但這通常涵蓋Unix和Windows或Mac之間的區別。這會影響具體具有println()方法的打印作者類型類。但是一個servlet不必使用這些。這涉及到您的servlet如何創建輸出。即。從現有文件加載數據。 /使用JSON/XML庫。是隱含地輸出CR LF值的代碼? – slipperyseal

+0

但您在回答中確實提到了println,請查看依賴於平臺的行分隔符屬性 – slipperyseal

+0

您只是在尋找爲什麼發生這種情況,或者您想要一種方法來修改代碼以確保它不會發生(包括跨平臺) ? – Alex

回答

0

我假設您的代碼示例中的out是由ServletResponse.getWriter()返回的作家,它是PrintWriter

除非使用編寫器實現的servlet容器tinkers,它應該使用由System.getProperty("line.separator")返回的平臺相關行分隔符。在默認的unix系統上,這是\n

要解決您的問題,您可以首先檢查受感染系統上的System.getProperty("line.separator")的值,如果是Windows分隔符,則查找更改系統屬性或檢查啓動服務器的命令是否覆蓋系統的代碼物業通過-Dparameter

相關問題