Java 中的 Character.LINE_SEPARATOR 不太可能在用户输入中找到吗?

Is Character.LINE_SEPARATOR in Java unlikely be be found in user input?

我正在 Spring 启动应用程序中实现一个“hack”,通过将公司 ID 和用户名混合成一个文本字符串来实现 3 部分登录(公司 ID、用户名、密码)一个分隔符,稍后将它们解析出来。 here by Chris Oberle on Baeldung.com.

描述了这种方法

Oberle 使用 Character.LINE_SEPARATOR 作为分隔符。恐怕这会变得很烦人 if 这是一个可以轻松输入登录表单的字符(例如,通过按 Enter 键或通过复制粘贴他们的用户名)。

我的问题是:Character.LINE_SEPARATOR Character 常量不太可能意外地进入用户输入是一个不错的选择吗? 如果不,我愿意接受更好选择的建议。

Character.LINE_SEPARATOR 是一个不错的选择,因为大多数输入本应不允许输入,并且它是 OS 不可知论者。如果您遇到问题,您还可以使用另一个特殊字符,如

%

然后使用 ReGeX 来确保不允许他们输入。

但实际上,Character.LINE_SEPARATOR 是您最好的选择

没有

Character.LINE_SEPARATOR 甚至不是一个字符。它是一个常量,对应于 类别 ,由 getType 方法返回。换句话说,以下代码打印 true:

System.out.println(Character.getType('\u2028') == Character.LINE_SEPARATOR);

这个常量的类型是byte,也就是说是一个数值,不是字符。因此,由于链接文章包含类似

的表达式
String.format("%s%s%s", username.trim(), String.valueOf(Character.LINE_SEPARATOR), domain)

这是一种获得与直接表达式相同结果的不必要的昂贵方法

username.trim() + Character.LINE_SEPARATOR + domain

将数值转换为字符串表示,相当于下面的代码:

username.trim() + "13" + domain

是的,actual value13,它将被转换为字符串 "13"

所以现在,很明显这不是一个好的分隔符,因为合法的用户名可能包含字符串 "13".

另一个问题是实际的行分隔符是否会成为一个好的分隔符。这取决于在包含此类分隔符时值是否会正确传输到目标。请注意,这从未经过测试——文章的作者实际上使用字符串 "13" 作为分隔符。

我的建议是只使用 @ 符号来分隔用户名和域。这是一个公认的模式,当您禁止 @ 登录用户和域名时,没有人会感到惊讶。