一:問題描述:java
在springboot-security框架生成BCryptPasswordEncoder()方法生成加密後的密碼後,帶有$符號,致使新增用戶的時候插入不了,報(IndexOutOfBoundsException: No group 2)的錯誤!spring
谷歌一下 java.lang.IndexOutOfBoundsException: No group 這個錯誤會發現是 String.replace方法出現反斜槓\或美圓符號$時會出現這個異常,sql
二:出現問題的緣由:數據庫
MyBatis直接插入含有$符號的字符串是能夠的!springboot
我在項目中自定義了一個mybatis的分頁插件,因此實現了mybaits的Interceptor接口!在mybatis的實現類中,爲了拼接sql字符串,調用了replace這個方法,以下:mybatis
sql = sql.replaceFirst("\\?", youString);
以此來完成,數據庫的sql語句拼寫!把"insert into sys_user(id,created_time,modified_time,remark,login_name,password,status) values(?,?,?,?,?, ? ,?)";中的"?"替換成對應的實體對象值!app
因爲經過BCryptPasswordEncoder().encode加密後的密碼是:$2a$10$9zXJY.gYiv2A6ay0pAMLzONOLswRaHSrbb8VZWW7O7K5aPlvraOfq 這樣的字符串!裏面還有$符號,致使調用框架
String.replace的方法時候 報錯,由於含有特殊字符,replace沒法替換。因此須要對字符串進行轉義!能夠本身寫方法,也能夠調用jdk(1.5之後)裏面的方法ui
java.util.regex包中的Matcher.quoteReplacement()來進行字符串的轉義!
三:解決的辦法是:
因此只須要把 替換的方法改爲以下 就能夠了!
sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(youString));
其中quoteReplacement方法的源碼是源碼是:加密
public static String quoteReplacement(String s) { if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1)) return s; StringBuilder sb = new StringBuilder(); for (int i=0; i<s.length(); i++) { char c = s.charAt(i); if (c == '\\' || c == '$') { sb.append('\\'); } sb.append(c); } return sb.toString(); }