Spring 安全性 java.lang.IllegalArgumentException: 输入中的非十六进制字符
Spring Security java.lang.IllegalArgumentException: Non-hex character in input
我在 Windows7 环境中的 Tomcat 服务器中部署了一个现有的 Maven 项目。我正在使用 tomcat7 , spring-security-core 3.1.0 .
但是,每次我登录我的网络应用程序时,我都会收到一个错误
java.lang.IllegalArgumentException: Non-hex character in input
代码在 Linux 环境中运行良好。所以我认为这是因为我在本地环境中使用 windows7。当我查看互联网时,我发现这是 linux 和 windows 之间的编码问题。
我尝试设置
JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
但还没有成功。请帮帮我。提前致谢!
最有可能的是,当您登录时,事件发生的顺序是:
- Spring 通过用户名从数据库中选择一个实体。
- Spring 必须检查输入的密码是否与存储的编码密码匹配。
要检查匹配,Spring 使用 PasswordEncoder,您很可能已经配置了它。
您的密码编码器期望存储的编码密码是一个十六进制字符序列(之前由此 PasswordEncoder 编码)。因此,它尝试将 CharSequence 解码为 byte[],但失败了 (source).
解决方案是让用户使用以前编码的密码,例如通过 BCryptPasswordEncoder.
Alex Derkach 的回答很适合我!
在我的例子中,我有带有直接存储密码的数据库(开发)看起来像 User=roor, psw=root.
所以当我评论(删除).passwordEncoder(new StandardPasswordEncoder("53c433t")); !
它的工作
!!但是错了,密码必须以加密形式存储!!!
一个可能的原因是混用了密码编码器。 PasswordEncoder
有不同的实现。并且,例如,如果您使用 SymmetricPasswordEncoder
进行编码并使用 StandardPasswordEncoder
进行解码,您可能会遇到此异常。
我在 Windows7 环境中的 Tomcat 服务器中部署了一个现有的 Maven 项目。我正在使用 tomcat7 , spring-security-core 3.1.0 .
但是,每次我登录我的网络应用程序时,我都会收到一个错误
java.lang.IllegalArgumentException: Non-hex character in input
代码在 Linux 环境中运行良好。所以我认为这是因为我在本地环境中使用 windows7。当我查看互联网时,我发现这是 linux 和 windows 之间的编码问题。
我尝试设置
JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
但还没有成功。请帮帮我。提前致谢!
最有可能的是,当您登录时,事件发生的顺序是:
- Spring 通过用户名从数据库中选择一个实体。
- Spring 必须检查输入的密码是否与存储的编码密码匹配。
要检查匹配,Spring 使用 PasswordEncoder,您很可能已经配置了它。
您的密码编码器期望存储的编码密码是一个十六进制字符序列(之前由此 PasswordEncoder 编码)。因此,它尝试将 CharSequence 解码为 byte[],但失败了 (source).
解决方案是让用户使用以前编码的密码,例如通过 BCryptPasswordEncoder.
Alex Derkach 的回答很适合我!
在我的例子中,我有带有直接存储密码的数据库(开发)看起来像 User=roor, psw=root.
所以当我评论(删除).passwordEncoder(new StandardPasswordEncoder("53c433t")); !
它的工作
!!但是错了,密码必须以加密形式存储!!!
一个可能的原因是混用了密码编码器。 PasswordEncoder
有不同的实现。并且,例如,如果您使用 SymmetricPasswordEncoder
进行编码并使用 StandardPasswordEncoder
进行解码,您可能会遇到此异常。