仿牛客社区项目笔记-构建安全高效的企业服务(引入Spring Security)

仿牛客社区项目笔记-构建安全高效的企业服务(引入Spring Security)

  • 构建安全高效的企业服务
    • 1. 权限控制
    • 2. 置顶,加精和删除
    • 3. 网站数据统计
    • 4. 热帖排行
    • 5. 生成长图
    • 6. 将文件上传至云服务器
    • 7. 优化网站性能

构建安全高效的企业服务

分为。

1. 权限控制

仿牛客社区项目笔记-构建安全高效的企业服务(引入Spring Security)_第1张图片
注:user 表中的 type:‘0-普通用户; 1-超级管理员; 2-版主;’。

  1. 引入 spring-boot-starter-security 依赖。
  2. 在 WebMvcConfig 中将 LoginRequiredInterceptor 拦截器废弃。
  3. 在 CommunityConstant 中设置:普通用户,管理员和版主的权限常量。
  4. 在LoginTicketInterceptor 拦截器中进行认证,如果登录凭证有效,就构建 UsernamePasswordAuthenticationToken 认证并放入 SecurityContext 中,以便于Security进行授权。在用户退出登录时,清空 SecurityContext 内容。
  5. 新建 SecurityConfig 配置进行授权,对特定的映射路径进行权限设置。分别设置没有登录和权限不足时的反馈行为。

2. 置顶,加精和删除

注:其中 discuss_post 表中的帖子的属性 type:‘0-普通; 1-置顶;’,status:‘0-正常; 1-精华; 2-拉黑;’

  1. 点击置顶,加精和删除按钮,通过js分别映射到 DiscussPostController 层的 /top,/wonderful 和 /delete。
  2. 置顶和加精分别将 discuss_post 表中的帖子的属性 type 变为1,status变为1。然后触发发帖事件。删除将 status变为2,然后触发删帖事件(Toplic 为 TOPIC_DELETE),删除后在 js 中返回 index 首页。
  3. 发帖事件将更新后的帖子上传到 elasticsearch 服务器中。新增删帖事件,将帖子从 elasticsearch 服务器中删除。
  4. 在 SecurityConfig 中设置权限,版主可以进行置顶和加精。管理员可以进行删除。
  5. 利用 thymeleaf-security 在html中将按钮根据权限进行隐藏。

3. 网站数据统计

在这里插入图片描述
首先UV和DAU通过Redis存储。根据今日日期定义单日UV和单日DAU的key,类似于 uv:20220516。通过起始日期和终止日期定义区间UV和区间DAU的key,类似于 uv:20220516:20220517。

  1. 新增 DataInterceptor 拦截器,发送请求时,通过ip新增单日UV,通过UserId新增单日DAU。
  2. 在网址上直接输入 http://localhost:8080/community/data 映射到 DataController 层的 /data。返回统计页面。
  3. 在网站UV上选好日期,点击开始统计。映射到 /data/uv 路径。通过 dataService.calculateUV 方法查询UV数量。
  4. calculateUV 方法将区间中每个日期UV的key放入List,然后使用 opsForHyperLogLog().union 进行合并,将值赋给区间UV的key。返回区间UV的数量。DataController 层将数量返回给浏览器。
  5. 在活跃用户上,点击开始统计,映射到 /data/dau 路径。通过 dataService.calculateDAU 方法查询DAU数量。
  6. calculateDAU 方法将区间中每个日期DAU的key放入List。然后进行or运算,将值赋给区间DAU的key,返回数量。DataController 层将数量返回给浏览器。
  7. 在 SecurityConfig 中配置只有管理员才能访问该路径。

4. 热帖排行

引入分布式定时任务Quartz,添加起步依赖,在application.properties中配置。

  1. 当发帖子,对帖子进行点赞,评论和加精时,将帖子 id 放入Redis的set中。
  2. 在 PostScoreRefreshJob 中设置定时任务,将需要计算分数的帖子id的从Redis的set中取出。将每个帖子的分数算出,将分数更新到数据库中。将帖子更新到elasticsearch中。

score = log(精华分+评论数 * 10+点赞数 * 2)+(发布时间 - 起始时间 )

  1. 在 QuartzConfig 对定时任务进行配置,设置 JobDetail 和 SimpleTrigger。其中设置了定时执行的时间。这样配置好后,Quartz就能自动的执行定时任务。
  2. 重构查询帖子函数,加入 orderMode 变量,orderMode=0时按照时间倒叙,orderMode=1时加入分数倒叙。其中包括重构service和dao层。在首页点击 “最热” 时,传入orderMode=1。查询出按照分数排名的帖子列表。

5. 生成长图

  1. 安装wk,在application.properties中配置wk的命令位置和存储位置。
  2. 在WkConfig配置中创建WK图片目录。
  3. 在CommunityConstant设置topic常量,通过路径访问ShareController中 /share。触发分享事件。

路径:http://localhost:8080/community/share?htmlUrl=https://www.baidu.com/

  1. EventConsumer中设置消费分享事件。通过 Runtime.getRuntime().exec(cmd) 命令生成长图并存入存储路径。
  2. 同时将生成一个网址返回给浏览器,访问该网址可以浏览到图片。

6. 将文件上传至云服务器

  1. 添加七牛云依赖。在application.properties中配置七牛云秘钥,空间名称和url。
  2. 重构上传头像,在 UserController的 /setting 中,生成上传凭证和随机头像名称,返回给设置页面。
  3. 选好头像后提交表单,通过 setting.js 将头像上传至七牛云。然后访问 /user/header/url 将用户头像路径更改。
  4. 重构生成长图,在 EventConsumer 的消费分享事件中,将长图生成后,传至七牛云。因为长图生成需要时间,所以通过定时多线程实现上传。

7. 优化网站性能

仿牛客社区项目笔记-构建安全高效的企业服务(引入Spring Security)_第2张图片
仿牛客社区项目笔记-构建安全高效的企业服务(引入Spring Security)_第3张图片

对热帖列表进行缓存,因为它可以很长时间保持不变。在此项目中,仅使用了Caffeine做本地缓存,没有使用二级缓存。

  1. 引入Caffeine依赖,在application.properties中配置缓存最大数量和失效时间。
  2. 在 DiscussPostService 中设置帖子列表缓存和帖子总数缓存变量。使用 @PostConstruct 注解在Service注入前对两个缓存变量进行初始化。
  3. findDiscussPosts 和 findDiscussPostRows 方法查询数据库前,先在本地缓存中查询帖子列表和帖子总数。第一次查没有的话,Caffeine会先查询数据库然后写入本地缓存中然后返回。以后再查就可以在本地缓存中获取。
  4. 使用JMeter进行压力测试,用100个线程的线程组访问 /community/index?orderMode=1 共60s。优化后吞吐量为153.6/sec。优化前吞吐量为18.3/sec。效率提高了10倍左右。

你可能感兴趣的:(仿牛客社区项目笔记,java)