zoukankan      html  css  js  c++  java
  • 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),提高系统的可用性。

    • 压力测试软件:

  • 相关阅读:
    计算机操作系统第四、五章自测题-存储管理
    oracle进制转换
    表空间、数据文件增长情况
    游标、type使用示例
    Linux如何查找大文件或目录总结-1127
    Linux如何查找大文件或目录总结
    工具: ass109.awk 分析 Oracle 的跟踪文件
    分页存储过程
    CSDN Oracle版精华帖荟萃
    vi 替换字符串
  • 原文地址:https://www.cnblogs.com/77-is-here/p/13763138.html
Copyright © 2011-2022 走看看