本文介绍服务器端免费的配置HTTPS证书。
使用Let’s Encrypt证书,安全性优良,各大厂商都支持,还能实现自动更新有效期
#路径 存放源代码路径
#获取letsencrypt
git clone https://github.com/letsencrypt/letsencrypt
#进入letsencrypt目录
cd letsencrypt
#生成证书 --email后填写自己的邮箱 -d 后面填写需要配置证书的域名(支持多个哦)
# ./letsencrypt-auto certonly --standalone --email xsj34567@163.com -d blogyw.meizhangzheng.com 2021.03弃用
yum install epel-release # 安装epel
yum install snapd # 安装snapd
systemctl enable --now snapd.socket # 启用snapd.socket
ln -s /var/lib/snapd/snap /snap # 创建软链接
snap install --classic certbot # 安装certbot
ln -s /snap/bin/certbot /usr/bin/certbot # 创建certbot软链接
# 如果之前安装过Certbot出现了问题,可以进行重装
yum remove certbot # 卸载certbot
rm /usr/local/bin/certbot-auto # 删除安装文件
rm -rf /opt/eff.org/certbot
# //生成证书
certbot certonly --standalone --email xsj34567@163.com -d blogyw.meizhangzheng.com
# 证书路径
# Certificate is saved at: /etc/letsencrypt/live/blogyw.meizhangzheng.com/fullchain.pem
# Key is saved at: /etc/letsencrypt/live/blogyw.meizhangzheng.com/privkey.pem
本文主要给出跨域示例,方便用户本地模拟。建议将下面文件通过nginx容器中(配置nginx.conf)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!-- cdn -->
<script type="text/javascript" src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
console.log("start");
var param = {
"pageSize": null,
"pageNum": null,
"condition": [
{
"name": "id",
"value": 1
}
]
};
$(function(){
$("#cross").click(
function(){
$.ajax({
type: "post",
headers:{"Content-Type":"application/json;charset=UTF-8","Access-Control-Allow-Origin":"*","token":"XX"},
url:"http://127.0.0.1:9000/open/api/test",
data: JSON.stringify(param),
success:function(data){
console.log("start111")
console.log(data)
alert(data);
}
})
});
});
</script>
<body>
<input type="button" id="cross" value="跨域测试"
</body>
</html>
常见的WEB攻击
项目实际开发过程中常见用法积累。
基于查询引擎查询:
-- 按条件查询条数 (ssp_log 集合中 type为 ssp .....)
db.getCollection("ssp_log").find({"type":"ssp","action":2,"table":"premises","time":{$lte:1617379200},"data":{$regex:".*?\\【.*"}}).count()
-- 模糊查询 LIKE
db.getCollection("ssp_log").find({“premises_name”:{$regex:"茂业"}})
Java 应用中查询
Query query = new Query();
//要查询的字段
query.fields().include("primary_id").include("data");
Criteria criteria = Criteria.where("type").is("ssp")
//注意数据类型 "2" 查询不出来
.and("action").is(2)
.and("table").is("premises")
//查询时间
.and("time").gte(startTime)
.and("data").regex(Pattern.compile(".*?\\【.*", Pattern.CASE_INSENSITIVE));
query.addCriteria(criteria);
//分页查询 (底层是通过skip 、limit来分页的)
Pageable pageable = PageRequest.of(page, size);
log.info("-------------->MongoDB getPage start");
List<SspLog> objs = this.mongoTemplate.find(query.with(pageable), SspLog.class, "xx_log");
Mongo mg = new Mongo();
DB db = mg.getDB("data");
DBCollection coll = db.getCollection("xx_log");
DBCursor limit = coll.find().skip((pageNum-1)*pageSize).sort(new BasicDBObject()).limit(pageSize);
db.getCollection('data_definition').find({"key":{$regex:"ncc_"}}).forEach(function(item){
print( 'db.getCollection("data_definition").insert(' + tojson(item) + ');' );
});
-- 执行时如果出现 not master ,说明是从库,没有写权限;直接从换主库执行。
MongoDB 是一个基于分布式文件存储的数据库 (4.0版本开始支持事务)。
不适合的场景:
大致:MongoClient客户端请求,经过Mongos 路由,依据Mongod Config配置,选择不同的分片或服务查询、写入Mongod 数据。(RPC、HTTP)
根据其部署方式不同,读写数据原理有差异:
MongoDB 的部署方案有单机部署、复本集(主备 PSS)部署、分片部署、复本集与分片混合部署
单机: 直接读、写
主备:基于路由Mongos, 一般是奇数个服务; PSS (Primary DB、Secondary DB) 异步
分片:基于Shard服务,Config服务,实现分片(类似分库分表:range模式,id 散列<路由选择>)路由选择>
主备与分片:组合
# 基于dockerlearn 打包 (官网基础上添加了上海时间:mongo/4.4)
# 进入dockerfile文件的目录 无密码
docker build -t meizhangzheng/mongo .
#启动 无密码
docker run --name mongo -v /usr/meizhangzheng/data/mongo:/data/db -p 27017:27017 -d meizhangzheng/mongo:4.4
如果多次安装,注意清除原文件
目录权限 :读写 打包前 chmod +x docker-entrypoint.sh
容器内部常用命令不起作用,需重新安装
apt-get update && apt-get install -y vim
默认没有用户名与密码
如果启动命令中添加:–auth ,则创建用户后,登录需要密码。 mongo设置用户与密码
# 带密码登录 --auth
docker run --name mongo -v /usr/meizhangzheng/mongo/data:/data/db -p 27017:27017 -d meizhangzheng/mongo:4.4 --auth
#创建用户及权限
db.createUser({ user:'admin',pwd:'xsj+q',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},{ role:'dbOwner', db: 'admin'}]});
# 使用户生效
db.auth("admin","xsj+q");
# 权限: 为某个用户添加 dbOwner(包含readWrite、dbAdmin、userAdmin),作用于哪个数据库 (确保数据库存在)
# 一般用户: 读写权限即可 db.createUser({ user:'mzz',pwd:'123456',roles:[ { role:'readWrite', db: 'admin'}]});
> db.grantRolesToUser("admin",[{role:"dbOwner",db:"admin"}])
> db.grantRolesToUser("admin",[{role:"dbOwner",db:"mylog"}])
> db.grantRolesToUser("admin",[{role:"dbOwner",db:"my_customer"}]
# 通过客户端连接时,就需要用户名与密码、通过容器登录也需要密码
# docker exec -it mongo bash
# mongo -u admin -p xsj+q 库名
# db
# show users
# 创建数据库
use mylog
# 创建用户
db.createUser({ user:'mzz',pwd:'123456',roles:[ { role:'readWrite', db: 'mylog'}]});
db.auth("mzz","123456")
# 如果mylog 没有数据,则不会创建该集合(数据库)
show dbs #不能查看mylog
#进入容器
docker exec -it mongo bash
#访问某一数据库
root@8cc31ea24bb0:/# mongo -u mzz -p 123456 mylog
#执行插入语句
db.mylog.insert({"name":"mzz"})
mongo-express : mongo web 管理端
Mongodb集群架构由Mongos、Config副本集和多个分片组成;
安装过程中先初始化Config副本集、分片副本集,最后通过Mongos添加分片
Config副本集存储了集群访问的用户及角色权限,为了方便管理,可以给分片副本集添加本地用户
Mongodb提供了LocalException机制,首次安装数据库时可以在本机直接添加用