2017-04-19 58 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