Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期
目录
JavaEE-HTTP-Servlet&路由&周期
JavaEE-数据库-JDBC&Mybatis&库
思维导图
Java知识点:
功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.
框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等
技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充
安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充
安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
JavaEE-HTTP-Servlet&路由&周期
参考:https :// blog . csdn . net / qq_52173163 / article / details / 1211107531、解释
Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。
2、创建和使用Servlet
-创建一个类继承HttpServlet
-web.xml配置Servlet路由
-WebServlet配置Servlet路由
-写入内置方法(init service destroy doget dopost)
3、Servlet生命周期
4、处理接受和回显
HttpServletRequest是ServletRequest的子接口
getParameter(name) — String 通过name获得值
getParameterValues — String[ ] 通过name获得多值
HttpServletResponse是ServletResponse的子接口
setCharacterEncoding() 设置编码格式
setContentType() 设置解析语言
getWriter() 获得一个PrintWriter字符输出流输出数据
PrintWriter 接受符合类型数据
IDEA配置
- 打开idea
- 创建javaEE项目
- 项目模板选用Web程序,创建Tomcat服务器
- 下载JDK1.8稳定版
- 选择javaEE 8创建项目即可
- 点击运行,即可看到网页页面
然后一路 next, 可能报错 javaee9 至少需要 java11 支持,直接将 javaee9 换为 javaee8 即可
要记得添加框架支持:Web框架,JavaEE框架支持
Facet 是 IntelliJ IDEA 中用于向项目添加功能和框架支持的概念,它提供了配置选项和功能集合。使用 Facet 可以集中管理项目的不同功能和框架的设置和依赖项,提高项目的可维护性和开发效率。
工件是通过编译、打包、构建等过程生成的最终结果。例如,在 Java 中,编译 Java 源代码将生成编译后的字节码文件(.class 文件)作为工件。
Tomcat工件部署
Servlet & 路由 &周期
JavaEE的核心-Servlet:https://blog.csdn.net/qq_52173163/article/details/121110753
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet 可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了 web 开发的相关内容以及 servlet 相关内容的配置使用,是 JAVAEE 开发的重中之重。
创建和使用Servlet
创建一个类继承HttpServlet
web.xml配置Servlet路由
这样也可以
写入内置方法(init service destroy doget dopost)
package com.example.demo1;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;@WebServlet("/a") public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// HttpServletRequest是ServletRequest接口的子接口,提供了用于处理HTTP请求的额外功能。// HttpServletResponse是ServletResponse接口的子接口,提供了用于处理HTTP响应的额外功能。System.out.println("--------------doGet");// 通过参数名获取请求中的值。返回一个String,表示与给定参数名相对应的单个值。String id =req.getParameter("id");// 设置响应内容的类型和编码。常用于指定输出的数据类型,如HTML、JSON等。resp.setContentType("text/html;charset=utf-8");// PrintWriter是用于向客户端输出字符数据的类,可以接受各种数据类型,然后将其转换为文本并发送到客户端。// 通过 resp.getWriter() 获取一个 PrintWriter 对象,用于向客户端返回响应数据。PrintWriter out = resp.getWriter();// 向客户端发送数据out.println("这是GET请求的数据:");out.println("id:"+id+"<br>");// 通过调用 out.flush() 刷新缓冲区,并调用 out.close() 关闭 PrintWriter 对象。out.flush();out.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.println("这是post提交的数据");out.println(name);out.flush();out.close();// 打印一条日志到终端System.out.println("--------------doPost");}// 当Servlet首次创建时调用的初始化方法@Overridepublic void init(ServletConfig config) throws ServletException{System.out.println("--------------init"); // try { // Class.forName("com.example.servletdemo.NewsServlet"); // // } catch (ClassNotFoundException e) { // throw new RuntimeException(e); // }}// 当Servlet被销毁时调用的方法@Overridepublic void destroy() {System.out.println("--------------destroy");super.destroy();}// 处理GET和POST请求的服务方法@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("--------------http service");super.service(req, resp);}// 覆盖的用于ServletRequest和ServletResponse的服务方法@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {System.out.println("--------------Servlet service");super.service(req, res);} }
Servlet声明周期
初次启动程序,终端没有表现,说明Servlet未被创建
使用get访问这个Servlet
关闭Servlet时
Servlet生命抽泣
JavaEE-数据库-JDBC&Mybatis&库
原生态数据库开发:JDBC参考:https://www.jianshu.com/p/ed1a59750127
JDBC(Java Database connectivity): 由java提供,用于访问数据库的统一API接口规范.数据库驱动: 由各个数据库厂商提供,用于访问数据库的jar包(JDBC的具体实现),遵循JDBC接口,以便java程序员使用!
1、下载jar
https://mvnrepository.com/
2、引用封装jar
创建lib目录,复制导入后,添加为库
3、注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
4、建立数据库连接
String url ="jdbc:mysql://localhost:3306/demo01";
Connection connection=DriverManager.getConnection(url,"x","x");
5、创建Statement执行SQL
Statement statement= connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
6、结果ResultSet进行提取
while (resultSet.next()){
int id = resultSet.getInt("id");
String page_title = resultSet.getString("page_title");
.......
}
安全修复SQL注入:预编译
原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
-框架数据库开发:Mybatis
Mybatis是一款优秀的持久层框架,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程,减少了代码的冗余,减少程序员的操作。
1、下载Jar包:https://mvnrepository.com/
2、引用jar包,创建lib目录,复制导入后,添加为库
添加为库
3、注册数据库驱动
JDBC(Java Database Connectivity)是 Java 用于与数据库交互的 API,而不同的数据库供应商提供了各自的 JDBC 驱动程序。在这里,"com.mysql.jdbc.Driver" 是 MySQL JDBC 驱动程序的类名。
加载和初始化: 当调用 Class.forName("com.mysql.jdbc.Driver"); 时,它会尝试查找、加载并初始化指定的类。在这个过程中,MySQL JDBC 驱动程序的静态代码块(static {...})会被执行,这通常用于注册驱动程序。
- 在旧版本的 MySQL 驱动中,com.mysql.jdbc.Driver 是驱动类的完整路径。
- 在新版本中,com.mysql.cj.jdbc.Driver 是 MySQL Connector/J 的驱动类。
4、建立数据库连接
Class.forName("com.mysql.jdbc.Driver");// 定义数据库连接的URL,格式为:jdbc:mysql://host:port/database
String url = "jdbc:mysql://localhost:3306/dome01";// 使用DriverManager获取数据库连接
Connection connection = DriverManager.getConnection(url, "root", "root");// 打印数据库连接信息
System.out.println(connection);
5、创建Statement执行SQL
connection.createStatement();: 在Connection对象上调用createStatement方法,创建一个Statement对象。Statement对象用于执行SQL语句,它可以执行静态的SQL查询、更新、删除等操作。createStatement方法返回一个新的Statement对象。
创建一个Statement对象,然后使用该对象执行给定的SQL查询语句,将查询结果存储在一个ResultSet对象中。这样,您可以通过遍历ResultSet来检索和处理查询的结果集中的数据。
6、结果ResultSet进行提取
package com.example.demo1;import java.sql.*;public class NewsServlet{public static void main(String[] args) throws ClassNotFoundException, SQLException {// 加载 MySQL 驱动程序Class.forName("com.mysql.jdbc.Driver");String url ="jdbc:mysql://localhost:3306/demo01";// 通过调用 DriverManager.getConnection() 方法,你可以获取到一个 Connection 对象,// 该对象表示与数据库的连接。你可以使用这个 Connection 对象执行 SQL 语句和事务操作。Connection connection = DriverManager.getConnection(url,"root","123456");System.out.println(connection);String sql="select * from news";//危险写法//String vulsql="select * from news where id="+id;//预编译写法String safesql="select * from news where id=?";System.out.println(sql);// connection.createStatement() 是用来创建一个 Statement 对象,Statement statement= connection.createStatement();// 而 statement.executeQuery(sql) 是用来执行 SQL 查询并返回结果集。ResultSet resultSet = statement.executeQuery(sql);// resultSet.next() 方法用于将结果集的指针移动到下一行,并返回一个布尔值,// 表示是否还有更多行可供遍历。通过使用 while 循环,可以在结果集还有下一行的情况下不断迭代。while (resultSet.next()){// resultSet.getInt("id") 用于获取当前行 "id" 列的整数值,并将其赋给变量 id。int id = resultSet.getInt("id");String page_title = resultSet.getString("page_title");String heading = resultSet.getString("heading");String subheading = resultSet.getString("subheading");String content = resultSet.getString("content");String img = resultSet.getString("img");System.out.println(id+"|"+page_title+"|"+heading+"|"+subheading+"|"+content+"|"+img);}}
}
安全修复SQL注入:预编译
原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
- 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
- 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
- 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setInt(1, id) 将 id 的值设置到第一个占位符上。这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
- 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
- 处理结果集: 根据业务需要,处理查询结果集的数据。
// 预编译写法 String safesql = "SELECT * FROM news WHERE id=?";// 使用PreparedStatement try (PreparedStatement preparedStatement = connection.prepareStatement(safesql)) {**// 设置参数,防止SQL注入攻击preparedStatement.setInt(1, id);**// 执行查询ResultSet resultSet = preparedStatement.executeQuery();// 处理结果集... } catch (SQLException e) {e.printStackTrace(); }
相比较于直接拼接 SQL 语句的方式,预编译语句提供了更好的安全性,可以防止SQL注入攻击。在使用预编译语句时,务必通过参数设置的方式传递值,而不要直接拼接值到 SQL 语句中。
思维导图
相关文章:

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期
目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架…...
C语言下使用SQL语言
需头文件:#include<sqlite.h>---需下载 1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(…...
Gitea相关漏洞
Go代码审计:Gitea远程命令执行漏洞链_新闻中心-网盾网络安全培训学校 Vulhub靶场gitea-1.4远程代码执行漏洞复现_gitea 漏洞-CSDN博客...

基于深度学习的图像去雨去雾
基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址: https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾,使用的网络为unet, 网络代码: import torch import torch.nn as nn from torchsumm…...
使用JS的for循环实现九九乘法表
九九乘法表是我们在学习基础数学时经常会遇到的一个概念。在编程中,使用循环结构来实现九九乘法表是一个很好的练习。下面,我将详细介绍如何使用JavaScript的for循环来实现九九乘法表。 首先,我们需要理解for循环的基本结构。在JavaScript中…...

Leetcode 70 爬楼梯
文章目录 1. 题目描述2. 我的尝试 1. 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到…...

基于SpringBoot+MYSQL+Vue的校园管理系统
目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、操作流程 3.2、添加信息流程 3.3、删除信息流程 4、系统设计 4.1 系统体系结构 4.2开发流程设计 4.3 数据库设计原则 4.4 数据表 5、运行截图(部分) 5.1管理员功能模块 5.2用户功能模块 5.3院校管理员功能模块…...
Oracle P6 负浮时和必须完成日期
前言 学习过计划的人大都有这有这样的经历,即无论是Microsoft Project 亦或是P6见过负浮时那么 Primavera P6 计划中的负浮时是从何而来的呢,那么本文可能会有所帮助。 首先,当活动的最晚日期早于最早日期时,就会出现负浮时。 换…...

【C++】STL--String
这一节主要总结string类的常见接口,以及完成了string类的模拟实现。 目录 标准库的String类 string类常见接口 string类对象的常见构造 string析构函数:~string string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 s…...
深入理解与使用go之中间件--实现
深入理解与使用go之--中间件实现 目录 引子 中间件 定义 原理 简单实现 多个中间件 优化 扩展 gin框架实现 引子 我们在做web开发的时候,经常会遇到下面一些需求: 统计耗时:想程序内部统计某个路由的请求耗时 预处理:接口需要登录鉴权后才能继续进行 错误捕获:当…...

移动端研发技术的进化历程
移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来,一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台(比如iOS或Android)所特有的应用,使…...

ChromeDriver 122 版本为例 国内下载地址及安装教程
ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊,不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…...

【数据结构】双向链表及LRU缓存的实现
目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…...
2、计划任务不显示UI的问题
计划任务不显示UI的问题 1、原因: 在windows7以上系统,使用system权限启动的进程默认是没有ui界面,这是windows系统出于安全考虑的限制。防止用户在高权限下误删重要的文件。 2、解决方案: 1、降权 解决的办法:降…...
学C还是学C++?
计算机专业学生,大一上学期学习了C语言,下学期学校要学C,请问我寒假继续深入学习C还是提前学C,大佬们有什么建议吗?(个人感觉C学的不是很明白,链表文件什么的还不是很懂…) 这个并没有一个统一的…...
Springboot参数分组校验
Springboot参数分组校验 文章目录 Springboot参数分组校验简介代码准备单个或多个参数的校验非 JSON 格式的对象参数校验JSON 格式的对象参数校验Service 层校验项目地址 简介 Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate …...

无缝集成 MongoDB Relational Migrator,Tapdata 提供关系型到 MongoDB 实时迁移优化方案
在去年的 MongoDB 用户大会纽约站上,MongoDB 正式宣布全面推出新工具 MongoDB Relational Migrator(MongoDB RM),用以简化应用程序迁移和转换——即从传统关系型数据模型到现代的文档数据模型,助力组织快速提升运营效率…...
【C++】每日一题 146 LRU缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 …...
CentOS搭建NAS服务器并使用
CentOS搭建NAS服务器并使用 文章目录 前言一、配置NAS服务器安装 NFS 服务:启动 NFS 服务:使 NFS 服务在系统启动时自动启动: 二、挂载服务器三、常见错误以及解决方案1、mount.nfs: No route to host2、mount.nfs: access denied by server …...

爬虫入门到精通_框架篇16(Scrapy框架基本使用)_名人名言的抓取
1 目标站点分析 抓取网站:http://quotes.toscrape.com/ 主要显示了一些名人名言,以及作者、标签等等信息: 点击next,page变为2: 2 流程框架 抓取第一页:请求第一页的URL并得到源代码,进行下…...
mac inter 芯片遇到程序无法打开(无法验证开发者)
mac inter 芯片遇到程序无法打开(无法验证开发者) 解决方案 终端运行命令: sudo xattr -r -d com.apple.quarantine 文件路径(直接把文件拖入到终端,可以自动找到文件路径)即可令其获得权限 补充知识: 通过gpt可以…...

科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处
科技成果鉴定测试,作为科技领域中一项重要的质量检验手段,具有广泛的应用范围。旨在为科技成果的研发者和使用者提供客观、科学、权威的鉴定结果,从而评估科技成果的技术水平和市场竞争力。 科技成果鉴定测试是对科技成果进行系统、全面的…...

八、词嵌入语言模型(Word Embedding)
词嵌入(Word Embedding, WE),任务是把不可计算、非结构化的词转换为可以计算、结构化的向量,从而便于进行数学处理。 一个更官方一点的定义是:词嵌入是是指把一个维数为所有词的数量的高维空间(one-hot形式…...
重学SpringBoot3-WebMvcConfigurer接口
摘要: 本文详细介绍了SpringBoot 3中的WebMvcConfigurer接口,旨在帮助读者深入理解其原理和实现,从而能够更好地使用SpringBoot进行Web开发。阅读本文需要大约30分钟。 关键词:SpringBoot, WebMvcConfigurer, SpringMVC, Web开发…...

《深入理解springCloud与微服务》笔记
第一章 微服务介绍 1.3 微服务的不足 1.3.2 分布式事务 CAP 理论,即同时满足“一致性”“可用性”和“分区容错”是 件不可能的事。 Consistency :指数据的强一致性。如果写入某个数据成功,之后读取,读到的都是新写入的数据&a…...
Vivado原语模板
1.原语的概念 原语是一种元件! FPGA原语是芯片制造商已经定义好的基本电路元件,是一系列组成逻辑电路的基本单元,FPGA开发者编写逻辑代码时可以调用原语进行底层构建。 2.原语的分类 原语可分为预定义原语和用户自定义原语。预定义原语为如and/or等门级原语不需要例化,可以…...

【linux本地安装tinycudann包教程】
【linux本地安装tinycudann包教程】 tiny-cuda-nn官网链接 如果你是windows 10系统的,想要安装tiny-cuda-nn可以参考我的文章——windows 10安装tiny-cuda-n包 根据官网要求:C++要求对应14,其实这样就已经告诉我们linux系统中的gcc版本不能高于9,同时下面又告诉我们gcc版…...

使用Nginx进行负载均衡
什么是负载均衡 Nginx是一个高性能的开源反向代理服务器,也可以用作负载均衡器。通过Nginx的负载均衡功能,可以将流量分发到多台后端服务器上,实现负载均衡,提高系统的性能、可用性和稳定性。 如下图所示: Nginx负…...

什么护眼台灯效果好?热门护眼台灯全方位测评推荐
台灯可以说是佳佳必备,尤其是家中有正在上学的孩子的更是需要一款好的台灯,不管是看书、写字都离不开台灯。不过很多家长在挑选台灯时往往仅关注到光线亮度是否充足,而忽略掉光线均匀度、舒适度等等方面的问题。所以选择一款优质的护眼台灯是…...

云上三问,迈向智能时代的关键
在今天的中国,第一热词是什么?面对这个问题,“新质生产力”当仁不让,而智能化技术毫无疑问是“新质生产力”最重要的来源之一。 在这样的大势下,大型政企是向新技术要“新质生产力”的时代先锋。云服务,则是…...