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 value 是 13
,它将被转换为字符串 "13"
。
所以现在,很明显这不是一个好的分隔符,因为合法的用户名可能包含字符串 "13"
.
另一个问题是实际的行分隔符是否会成为一个好的分隔符。这取决于在包含此类分隔符时值是否会正确传输到目标。请注意,这从未经过测试——文章的作者实际上使用字符串 "13"
作为分隔符。
我的建议是只使用 @
符号来分隔用户名和域。这是一个公认的模式,当您禁止 @
登录用户和域名时,没有人会感到惊讶。
我正在 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 value 是 13
,它将被转换为字符串 "13"
。
所以现在,很明显这不是一个好的分隔符,因为合法的用户名可能包含字符串 "13"
.
另一个问题是实际的行分隔符是否会成为一个好的分隔符。这取决于在包含此类分隔符时值是否会正确传输到目标。请注意,这从未经过测试——文章的作者实际上使用字符串 "13"
作为分隔符。
我的建议是只使用 @
符号来分隔用户名和域。这是一个公认的模式,当您禁止 @
登录用户和域名时,没有人会感到惊讶。