1. Spring Security
简介
Spring Security是一个专注于为Java 应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求
特征
对身份的 认证 和 授权
防止各种攻击,如会话固定攻击、点击劫持、csrf攻击等
支持与 Servlet API[Java EE]、Spring MVC等 Web技术集成
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 所管理的对象实例.
-
-
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),提高系统的可用性。
-
-
压力测试软件:
-
jmeter, 一款apache 出的压力测试软件
-
网站:
-