首页  编辑  

Java/MongoDB/密码包含特殊字符的处理/uri

Tags: /Java/   Date Created:
MongoDB如果使用uri来连接数据库,会出现特殊密码字符的问题,尤其是在docker容器等第三方部署工具中,会使用环境变量设置密码,而密码又没有明确转义的时候,会导致无法正常启动应用程序和连接MongoDB数据库。
MongoDB数据库对以下特殊字符需要转义: []/?#@
  1. import com.mongodb.ConnectionString;
  2. import com.mongodb.client.MongoClient;
  3. import com.mongodb.client.MongoClients;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. /**
  8.  * MongoDB connection configuration
  9.  * <p>
  10.  * In docker pods, using ENV variable to set the password and the password contains special chars<br/>
  11.  * To support special chars in password, we had to escape password first
  12.  */
  13. @Configuration
  14. public class MongoConfiguration {
  15.   @Value("${spring.data.mongodb.username}")
  16.   private String user;
  17.   @Value("${spring.data.mongodb.password}")
  18.   private String password;
  19.   @Value("${spring.data.mongodb.hosts}")
  20.   private String hosts;
  21.   @Value("${spring.data.mongodb.database}")
  22.   private String database;
  23.   @Value("${spring.data.mongodb.options:authSource=admin&tls=true&maxPoolSize=10&minPoolSize=2&connectTimeoutMS=60000&socketTimeoutMS=60000}")
  24.   private String options;
  25.   @Bean
  26.   MongoClient mongoClient() {
  27.     String uri = String.format("mongodb://%s:%s@%s/%s?%s", user, escape(password), hosts, database, options);
  28.     ConnectionString connectionString = new ConnectionString(uri);
  29.     return MongoClients.create(connectionString);
  30.   }
  31.   /**
  32.    * Escape special char of password for MongoDB connection string
  33.    *
  34.    * @param password Raw password string, might from ENV variable
  35.    * @return escaped password
  36.    */
  37.   private String escape(String password) {
  38.     return password.replace("@""%40")
  39.         .replace("/""%2F")
  40.         .replace("?""%3F")
  41.         .replace("[""%5B")
  42.         .replace("]""%5D")
  43.         .replace(",""%2C")
  44.         .replace("#""%23");
  45.   }
  46. }
application.properties中,需要添加配置:
  1. spring.data.mongodb.username=username
  2. spring.data.mongodb.password=password
  3. spring.data.mongodb.hosts=s1.abc.com:123,s2.abc.com:123,www.abc.com:456
  4. spring.data.mongodb.database=demo
  5. spring.data.mongodb.options=authSource=admin&tls=true&maxPoolSize=10&minPoolSize=2&connectTimeoutMS=60000&socketTimeoutMS=60000&cafile=abc.pem&tls=true