从零开始学习JavaWeb-15


 ​​一、数据库安全与防注入实战​

1. ​​SQL 注入原理与危害​
  • ​攻击本质​​:利用输入漏洞篡改 SQL 语义,例如:

    SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- AND password = 'xxx'

    OR '1'='1'导致条件永真,绕过密码验证。

  • ​危害​​:数据泄露(用户隐私)、越权操作(删库)、服务瘫痪。

2. ​​防御方案​
  • ​预编译(PreparedStatement)​​:强制分离指令与参数

    String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, inputUser);  // 参数视为值而非代码
    ps.setString(2, inputPass);
  • ​输入校验​​:正则过滤特殊字符(如 '--

    if (!inputUser.matches("[a-zA-Z0-9_]+")) { throw new InvalidInputException("用户名含非法字符");
    }
  • ​最小权限原则​​:数据库账号仅授权必要操作(禁用 DROPDELETE)。

3. ​​存储过程与ORM框架​
  • ​存储过程​​:封装 SQL 逻辑,减少动态拼接(但需防内部注入)

  • ​ORM 框架(如 MyBatis)​​:

    <select id="getUser" resultType="User">SELECT * FROM users WHERE username = #{user} <!-- #{} 自动预编译 -->
    </select>

 ​​二、MySQL 深度优化策略​

1. ​​索引优化与慢查询分析​

​索引类型​

​适用场景​

​优化效果​

​B+树索引​

等值查询(=)、范围查询(>

减少全表扫描,速度提升 10-100 倍

​哈希索引​

精确匹配(无范围查询)

O(1) 查询,但不支持排序

  • ​慢查询日志​​:

    -- 启用慢查询日志
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 2; -- 阈值2秒

    分析工具:mysqldumpslow、Percona Toolkit。

2. ​​事务隔离级别选择​

​级别​

​脏读​

​不可重复读​

​幻读​

​适用场景​

​READ UNCOMMITTED​

极少使用

​READ COMMITTED​

Oracle 默认

​REPEATABLE READ​

​MySQL 默认​

​SERIALIZABLE​

强一致性(金融系统)

​代码设置​​:

// JDBC 设置事务隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

 ​​三、数据库连接池调优​

1. ​​核心参数配置(以 Druid 为例)​

​参数​

​推荐值​

​作用​

initialSize

CPU核心数

启动时初始化连接数

maxActive

50

最大连接数(防数据库过载)

minIdle

5

最小空闲连接(应对突发流量)

maxWait

3000

获取连接超时时间(ms)

validationQuery

SELECT 1

心跳检测 SQL

​监控集成​​:

<!-- 启用 Druid 监控 -->
<servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern>
</servlet-mapping>

访问 http://localhost:8080/druid查看 SQL 执行效率、慢查询统计。


 ​​四、综合实战:用户管理系统安全优化​

1. ​​架构分层设计​
graph TBA[View] --> B[Controller]B --> C[Service]C --> D[DAO]D --> E[MySQL]F[Filter] -->|全局安全控制| B
  • ​Filter 层​​:统一防 XSS 攻击(过滤请求参数)。

  • ​Service 层​​:事务管理 + 密码加密(BCrypt)。

2. ​​关键代码实现​
  • ​密码加密存储​​:

    public String encryptPassword(String rawPassword) {return BCrypt.hashpw(rawPassword, BCrypt.gensalt());
    }// 验证密码
    public boolean checkPassword(String rawPassword, String hashedPassword) {return BCrypt.checkpw(rawPassword, hashedPassword);
    }
  • ​防 XSS 过滤器​​:

    @WebFilter("/*")
    public class XssFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {HttpServletRequest request = (HttpServletRequest) req;XssRequestWrapper wrappedRequest = new XssRequestWrapper(request); // 包装请求,过滤参数chain.doFilter(wrappedRequest, res);}
    }

 ​​五、高并发场景解决方案​

1. ​​读写分离(MySQL Replication)​

​角色​

​作用​

​配置示例​

​Master​

写操作(INSERT/UPDATE)

binlog-do-db = appdb

​Slave​

读操作(SELECT)

replicate-do-db = appdb

​代码路由​​:

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return TransactionSynchronizationManager.isCurrentTransactionReadOnly() ? "slave" : "master";}
}
2. ​​缓存优化(Redis)​
  • ​缓存穿透​​:布隆过滤器拦截非法查询。

  • ​缓存雪崩​​:随机过期时间 + 熔断降级。

// 查询优化:先查缓存,未命中再查库
public User getUserById(int id) {String key = "user:" + id;User user = redisTemplate.opsForValue().get(key);if (user == null) {user = userDao.findById(id); // 数据库查询redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);}return user;
}

 ​​六、总结与知识图谱​

​模块​

​核心技术点​

​企业级实践​

​数据库安全​

预编译 + 输入校验 + 权限控制

防御 SQL 注入/XSS 攻击

​MySQL 优化​

B+树索引 + 慢查询分析 + 事务隔离

提升查询效率至毫秒级

​连接池调优​

参数配置 + 实时监控

支撑 5000+ TPS 并发

​高并发架构​

读写分离 + Redis 缓存

应对百万级用户请求

​学习路线图​​:

graph LRA[基础] --> B[Servlet/JSP]B --> C[JDBC/连接池]C --> D[会话管理]D --> E[安全防护]E --> F[高并发架构]

​“安全是系统的生命线,性能是用户体验的基石”​

​动手实践​​:

  1. 注入防御测试:尝试攻击自己的系统(如输入 ' OR 1=1 --),验证防护有效性。

  2. 慢 SQL 优化:通过 EXPLAIN分析查询计划,添加复合索引。

  3. 压力测试:用 JMeter 模拟 1000 并发用户,优化连接池参数。


​扩展挑战​​:

  • 整合 ​​Spring Security​​ 实现 RBAC 动态权限控制。

  • 使用 ​​ShardingSphere​​ 实现分库分表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94276.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解深度学习中的“Batch”

文章目录 **一、什么是Batch?为什么需要它?** **二、Batch Size(批次大小)的影响** **三、Batch, Epoch 和 Iteration 的关系** **四、案例分析** 在深度学习领域,“Batch”(批次)是一个核心且至关重要的概念。它指的是在模型训练过程中,一次性输入给神经网络进行处理的…

27.语言模型

语言模型&#xff0c;是NLP方向一直主力研究的&#xff0c;通过训练机器&#xff0c;来让机器学习人类语言的内在规律&#xff0c;理解自然语言&#xff0c;并将其转换为计算机语言。 目前的主流语言模型&#xff0c;如GPT、Deepseek等&#xff0c;并不是简单的搜索背诵。他们的…

小智ai+mcp+n8n的智能组合

小智aimcpn8n的智能组合1 小智ai的版本2 n8n的配置3 mcp的demo4 工作流json​ 之前有写过小智ai的介绍&#xff0c;它提供了流畅且丰富的用户语音交互能力。n8n提供了灵活且稳定的后台工作流的能力&#xff0c;如果这两个工具进行组合&#xff0c;可以打造一个好玩又好用的智能…

【DataGrip】连接达梦数据库后,能查询数据但是看不到表的几种情况分析,达梦数据库驱动包下载DmJdbcDriver18.jar

大概分为以下两类情况&#xff0c;配置问题和驱动包的问题 DmJdbcDriver18.jar点击下载 1.配置了表不可见 左上角点击过滤的图标&#xff0c;把table勾上就可以 2.Introspect using JDBC metadata 未勾选 1&#xff09;老版本的DataGrip 在options选项下 3&#xff09;新版…

全面解析 `strncasecmp` 字符串比较函数

1) 函数的概念与用途 strncasecmp 是 C 语言中一个非常实用的字符串处理函数&#xff0c;它执行不区分大小写的字符串比较&#xff0c;但只比较前 n 个字符。这个函数的名字来源于"string n case-compare"&#xff08;字符串前n个字符不区分大小写比较&#xff09;。…

高级SQL优化 | 告别 Hive 中 GROUP BY 的大 KEY 数据倾斜!PawSQL 自适应优化算法详解

数据倾斜让你的Hive查询慢如蜗牛&#xff1f;单个热点分组拖垮整个集群&#xff1f;PawSQL独家算法GroupSkewedOptimization来拯救&#xff01;&#x1f3af; 痛点直击&#xff1a;当数据倾斜遇上分组操作想象这样一个场景&#xff1a;你的电商平台有1000万VIP用户订单和100万普…

HUMS 2023齿轮箱数据分析

HUMS问答&#xff1a;https://humsconference.com.au/HUMS2023datachallenge/questions-answers.html 数据集申请&#xff1a;https://www.dst.defence.gov.au/our-technologies/helicopter-main-rotor-gearbox-planet-gear-fatigue-crack-propagation-test 历年试卷&#xff1…

智慧工地:科技赋能与管理革新下的建筑业新图景

随着数字技术的深度渗透&#xff0c;智慧工地正以“技术落地 行业变革 管理创新”的三重突破&#xff0c;重构施工场景的核心逻辑&#xff0c;推动建筑业从传统粗放式发展向精细化、智能化转型。一、技术落地&#xff1a;用科技筑牢安全防线&#xff0c;提升施工效率技术是智…

[docker/大数据]Spark快速入门

[docker/大数据]Spark快速入门1. 概述 1.1 诞生背景Spark官方文档&#xff1a;https://spark.apache.ac.cn/docs/latest/Spark 由加州大学伯克利分校 AMP 实验室于 2009 年开发&#xff0c;2013 年成为 Apache 顶级项目&#xff0c;旨在解决 MapReduce 的三大核心问题&#xff…

CSS 定位的核心属性:position

&#x1f9e9; 一、CSS 定位的核心属性&#xff1a;positionposition 属性用于定义一个元素在页面中的定位方式&#xff0c;它决定了&#xff1a;元素在页面中的定位规则是否脱离文档流元素的位置是相对于谁&#xff08;父元素、浏览器窗口、自身等&#xff09;✅ 可选值如下&a…

数据结构之深入探索快速排序

基准值的选定 我们之前已经用四种不同的方式实现了快速排序&#xff0c;如果还没有学习过的伙伴们可以看一下这篇文章哦&#xff1a;数据结构之排序大全&#xff08;3&#xff09;-CSDN博客 那我们既然已经学习了这么多种方法&#xff0c;为什么还要继续探索快速排序呢&#…

《递归与迭代:从斐波那契到汉诺塔的算法精髓》

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向学习者…

《LINUX系统编程》笔记p3

可重用函数不使用全局部变量&#xff0c;可以重复使用的函数.stat 命令作用&#xff1a;显示一个文件或文件夹的“元信息”。文件基本信息文件&#xff08;File&#xff09;&#xff1a;显示所查询对象的名称。大小&#xff08;Size&#xff09;&#xff1a;文件的大小&#xf…

大模型0基础开发入门与实践:第3章 机器的“统计学”:机器学习基础概念扫盲

第3章 机器的“统计学”&#xff1a;机器学习基础概念扫盲 1. 引言 想象一下&#xff0c;你是一位古代的农夫&#xff0c;毕生的经验告诉你&#xff1a;乌云密布、燕子低飞&#xff0c;那么不久便会下雨。你并没有学习过气象学&#xff0c;也不懂大气压和水汽凝结的原理。你的“…

Java调用Ollama(curl方式)

1. 安装Ollama Search 2. 调用 相关依赖 <dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version></dependency><dependency>&…

nodejs koa框架使用

1: KOA 是express 打造的下一代web 开发框架提供更小更强的的核心功能&#xff0c;通过Promise 、async/await 进行异步编程&#xff0c;koa 可以不使用回调&#xff0c;解决了回调地狱的问题 blueBird 是nodejs 最出名的Primise 实现&#xff0c;除了实现标准的promise 之外&a…

2025年图像处理与光学国际会议(ICIPO 2025)

2025年图像处理与光学国际会议&#xff08;ICIPO 2025&#xff09; 2025 International Conference on Image Processing and Optics一、大会信息会议简称&#xff1a;ICIPO 2025 大会地点&#xff1a;中国北京 审稿通知&#xff1a;投稿后2-3日内通知 投稿邮箱&#xff1a;iac…

Kubernetes 构建高可用、高性能 Redis 集群

k8s下搭建Redis高可用1. 部署redis服务创建ConfigMap创建 Redis创建 k8s 集群外部2. 创建 Redis 集群自动创建 redis 集群手动创建 redis 集群验证集群状态3. 集群功能测试压力测试故障切换测试4. 安装管理客户端编辑资源清单部署 RedisInsight控制台初始化控制台概览实战环境使…

文件IO的基础操作

Java针对文件进行的操作:文件系统操作,File类(file类指定的路径,可以是一个不存在的文件)文件内容操作 : 流对象分为两类(1)字节流 以字节为基本的读写单位的 二进制文件 InputStream OutputStream(2)字符流 以字符为基本的读写单位的 …

【模版匹配】基于深度学习

基于深度学习的模版匹配 概述 本报告整理了2024-2025年最新的、可直接使用的模板匹配相关论文、方法和开源代码实现。所有方法都提供了完整的代码实现和预训练模型&#xff0c;可以直接应用到实际项目中。 一、轻量级现代模板匹配框架 1.1 UMatcher - 4M参数的紧凑型模板匹…