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

但还没有成功。请帮帮我。提前致谢!

最有可能的是,当您登录时,事件发生的顺序是:

  1. Spring 通过用户名从数据库中选择一个实体。
  2. Spring 必须检查输入的密码是否与存储的编码密码匹配。

要检查匹配,Spring 使用 PasswordEncoder,您很可能已经配置了它。

您的密码编码器期望存储的编码密码是一个十六进制字符序列(之前由此 PasswordEncoder 编码)。因此,它尝试将 CharSequence 解码为 byte[],但失败了 (source).

解决方案是让用户使用以前编码的密码,例如通过 BCryptPasswordEncoder.

Alex Derkach 的回答很适合我!
在我的例子中,我有带有直接存储密码的数据库(开发)看起来像 User=roor, psw=root.
所以当我评论(删除).passwordEncoder(new StandardPasswordEncoder("53c433t")); ! 它的工作
!!但是错了,密码必须以加密形式存储!!!

一个可能的原因是混用了密码编码器。 PasswordEncoder 有不同的实现。并且,例如,如果您使用 SymmetricPasswordEncoder 进行编码并使用 StandardPasswordEncoder 进行解码,您可能会遇到此异常。