一、背景
java程序连接mongo有两种方式:
- 用户名和密码方式
- uri方式
1、用户名和密码
以用户数据库为例,注意看它的密码
spring:
data:
mongodb:
host: 192.168.10.17
database: db_user_service
port: 3717
username: user_service
password: user_service@321
2、uri
转换为uri方式,就只需要一行搞定。
# 这里的密码假设为123456,如果像上面那样含有特殊字符,则需要进行转义
spring:
data:
mongodb:
uri: mongodb://user_service:123456@192.168.10.17:3717/db_user_service?maxIdleTimeMS=60000&maxPoolSize=50
有时候,为了安全性,dba会设置比较复杂的密码,含有特殊字符,比如@符号等。
如果使用方式一(用户名和密码)连接mongodb时,password里支持@符号。
但是,如果使用方式二(uri)连接,则需要对@符号转义为%40
否则java程序在解析uri的时候,会提前截取到第一个@,把前半部分错认为数据库的密码。
二。解决办法
当使用uri方式连接mongodb时,对特殊符号,特别是@符号,进行转义。
转换的结果是:
spring:
data:
mongodb:
uri: mongodb://user_service:user_service%40321@192.168.10.17:3717/db_user_service?maxIdleTimeMS=60000&maxPoolSize=50
这里顺便说一下,如果是Mysql数据库的密码含有!感叹号这样的特殊字符,它的转义方式则是反斜杠。
- 修改前
# 85f7e!d2e6X是用户数据库的实际密码
mysql -h 192.168.10.18 -u user_service -p85f7e!d2e6X -D db_user_service
- 修改后
# 85f7e\!d2e6X是转义后的结果
mysql -h 192.168.10.18 -u user_service -p85f7e\!d2e6X -D db_user_service
涉及到需要转义的字符有很多,这里就不一一赘述了。
遇到特殊字符的时候多留个心眼,设置数据库密码的时候,不要太复杂了哈。
比较是在内网环境下,不对外网访问的情况下,密码相对安全即可。(少折腾特殊字符)