Spring boot 论坛项目实战_07

项目进阶,构建安全高效的企业服务

1. Spring Security

  • 简介

    • Spring Security是一个专注于为Java 应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求

  • 特征

    • 对身份的 认证授权 提供全面的、可扩展的支持

    • 防止各种攻击,如会话固定攻击、点击劫持、csrf攻击等

    • 支持与 Servlet API[Java EE]、Spring MVC等 Web技术集成

  • 参考网站: https://spring.io/projects/spring-secutity

 

2. 权限控制

  • 登陆检查

    • 之前采用拦截器实现了登录检查,这是简单的权限管理方案,现在将其废弃

  • 授权配置

    • 对当前系统内包含的所有请求,分配访问权限(普通用户、版主、管理员)

  • 认证方案

    • 绕过Security 认证流程,采用系统原来的认证方案

      • // Security 底层默认会拦截 /logout 请求, 进行退出处理
        // 覆盖 默认逻辑, 才能执行我们自己的逻辑代码
        // 这里写一个不存在的逻辑, 欺骗底层替换它的退出路径, 使得我们自己的退出逻辑"/logout"得以执行
        http.logout().logoutUrl("/securitylogout");

         

  • CSRF配置

    • 跨站请求伪造(英语:Cross-site request forgery)

      恶意网站劫持了, 当前用户的 cookie, 伪造身份窃取用户信息

    • 防止CSRF 攻击的基本原理, 以及表单、AJAX相关的配置

 

3. 置顶、加精、删除

  • 功能实现

    • 点击 置顶,修改帖子的类型

    • 点击 “加精”、“删除”,修改帖子的状态

  • 权限管理[Spring Security赋权]

    • 版主可以执行“置顶”、“加精”操作

    • 管理员可以执行“删除”操作

  • 按钮显示

    • 版主可以看到“置顶”、“加精”按钮

    • 管理员可以看到“删除”按钮

 

4. Redis高级数据类型

  • 对网站的运营数据进行统计, 优点: 节约内存, 效率高

  • HyperLogLog[ 超级日志 ]

    • 采用一种基数算法, 用于完成独立总数的统计

    • 占据空间小, 无论统计多少个数据, 只占 12K 的内存空间

    • 不精确的统计算法, 标准误差为 0.81%【最终结果非精确】

  • Bitmap[ 位图 ]

    • 不是一种独立的数据结构, 实际上就是字符串

    • 支持按位存取数据, 可以将其看成是 byte 数组

    • 适合存储大量的连续的数据的布尔值

    • 多组数据可以进行运算, 逻辑运算 [ 与 | 或 | 非 ]

 

5. 网站数据统计

  • UV ( Unique Visitor )

    • 独立访客,需要通过用户 IP 排重统计数据

    • 每次访问都要进行统计

    • HyperLogLog,性能好,且存储空间小

  • DAU ( Daily Active User)

    • 更加关注的是 登录用户的ID

      更关注用户的有效性,要求精确结果

    • 日活跃用户, 需要通过用户 ID 排重统计数据

    • 访问过一次, 则认为其活跃

    • Bitmap, 性能好、且可以统计精确的结果

6. 任务执行和调度

  • JDK 线程池

    • ExecutorService

    • ScheduledExecutorService

  • Spring 线程池

    • ThreadPoolTaskExecutor

    • ThreadPoolTaskScheduler

  • 分布式定时任务

    • Spring Quartz

      • 三个关键接口

      • Scheduler: 定时任务执行器, Quartz 的底层调度器

      • Job: 任务接口, 包括对任务分组

      • Trigger: 任务触发器, 配置 Job 运行时间, 运行频率

      • // FactoryBean : 可简化Bean 的实例化过程: 
        // 1. Spring 通过FactoryBean 封装Bean 的实例化过程.
        // 2. 将 FactoryBean 装配到Spring 容器里.
        // 3. 将 FactoryBean 注入给其他的Bean.
        // 4. 该Bean[ 3. 中的Bean] 得到的是 FactoryBean 所管理的对象实例.
  • 参考网站: http://www.quartz-scheduler.org

 

7. 热帖排行

  • 每个网站都有自己的计算公式

  • 依据自己网站需求进行 计算逻辑设计

  • 固定时间周期进行热帖计算, 刷新

    • 利用Quartz 完成定时计算任务

  • 下面是三个参考网站的分数计算方式:

  • Hacker News

    • Score = ( P - 1 ) / ( T + 2 ) ^ G

  • StackOverflow

    • (log(Qviews)*4) + ((Qanswers * Qscore) / 5) + sum(Ascores)
      -----------------------------------------------------------
      ((QageInHours + 1)) - ((QageInHours) - (Qupdated)/2) ^ 1.5
  • Nowcoder

    • log(精华分 + 评论数*10 + 点赞数 * 2 + 收藏数 * 2) + (发布时间 - 牛客纪元[网站发布日期] )

 

8. 生成长图

  • wk<html>topdf

    • wkhtmltopdf url file

    • wkhtmltoimage url file

    • 注意: WKHTMLTOPDF 命令的使用, 需要提前手动创建好存储目录

    • CMD命令行,运行命令

    • pdf文件成功生成

    • CMD 命令生成 html 网页的图片文件

    • 图片文件生成成功

    • 生成原图的压缩图片【--quality 75: 压缩为原图的 75%】

    • 可以看到新图【2.png】是原图【1.png】比原图的大小明显缩小

     

  • java

    • Runtime.getRuntime().exec()

    • String cmd="d:/work/wkhtmltopdf/bin/wkhtmltoimage --quality 75  http://www.nowcoder.com d:/work/data/wk-images/3.png";
      try {
         Runtime.getRuntime().exec(cmd);
         System.out.println("ok.");
      } catch (IOException e) {
         e.printStackTrace();
      }

       

  • 参考网站: https://wkhtmltopdf.org

8.1 安装 WKHTMLTOPDF

  • 选择对应安装版本

  • 安装完成后,配置 bin 目录到环境变量中

    • Path中新建项

 

 

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

  • 客户端上传

    • 客户端将数据提交给云服务器, 并等待其响应。

    • 用户上传头像时, 将表单数据提交给云服务器。

  • 服务器直传

    • 应用服务器数据直接提交给云服务器,并等待其响应。

    • 分享时,服务端将自动生成的图片,直接提交给云服务器。

  • 上传服务器网站

 

10. 优化网站的性能

  • 本地缓存

    • 将数据缓存在应用服务器上, 性能最好

    • 常用缓存工具: Ehcache、Guava、Caffeine等。

    • 本次项目选用 Caffeine 实现

  • 分布式缓存

    • 将数据缓存在NoSQL数据库上,跨服务器

    • 常用缓存工具:MemCache、Redis等

  • 多级缓存

    • 一级缓存(本地缓存)---> 二级缓存(分布式缓存) ---> DB

    • 避免缓存雪崩(缓存失效,大量请求直达DB),提高系统的可用性。

  • 压力测试软件:

原文地址:https://www.cnblogs.com/77-is-here/p/13763138.html