Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

news2024/11/16 17:44:23

目录

JavaEE-HTTP-Servlet&路由&周期

JavaEE-数据库-JDBC&Mybatis&库

思维导图


Java知识点:

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatisSpringMVCSpringBootShiroLog4jFastJson

技术:ServletListenFilterInterceptorJWTAOP,待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充

JavaEE-HTTP-Servlet&路由&周期

参考:https :// blog . csdn . net / qq_52173163 / article / details / 121110753

1、解释

Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。本章内容详细讲解了web开发的相关内容以及servlet相关内容的配置使用,是JAVAEE开发的重中之重。

2、创建和使用Servlet

-创建一个类继承HttpServlet

-web.xml配置Servlet路由

-WebServlet配置Servlet路由

-写入内置方法(init service destroy doget dopost)

3Servlet生命周期

4、处理接受和回显

HttpServletRequestServletRequest的子接口

getParameter(name) — String 通过name获得值

getParameterValues — String[ ] 通过name获得多值

HttpServletResponseServletResponse的子接口 

setCharacterEncoding() 设置编码格式

setContentType() 设置解析语言

getWriter() 获得一个PrintWriter字符输出流输出数据

PrintWriter 接受符合类型数据

IDEA配置

  1. 打开idea
  2. 创建javaEE项目
  3. 项目模板选用Web程序,创建Tomcat服务器
  4. 下载JDK1.8稳定版
  5. 选择javaEE 8创建项目即可
  6. 点击运行,即可看到网页页面

然后一路 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 {
    @Override
    protected 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();
    }

    @Override
    protected 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首次创建时调用的初始化方法
    @Override
    public 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被销毁时调用的方法
    @Override
    public void destroy() {
        System.out.println("--------------destroy");
        super.destroy();
    }

    // 处理GET和POST请求的服务方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("--------------http service");
        super.service(req, resp);
    }

    // 覆盖的用于ServletRequest和ServletResponse的服务方法
    @Override
    public 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注入:预编译
原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

  1. 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,表示将在执行时动态替换。
  2. 使用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
  3. 设置参数: 使用 setXXX 方法设置占位符的值。在这里,使用 setInt(1, id) 将 id 的值设置到第一个占位符上。这种方式防止了 SQL 注入攻击,因为参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
  4. 执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
  5. 处理结果集: 根据业务需要,处理查询结果集的数据。
// 预编译写法
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 语句中。

思维导图

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

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

相关文章

在线编辑字体工具,支持对字体查看编码以及编辑

公司一个沉寂多年的项目需要进行二开&#xff0c;前面的开发的同学已经离开&#xff0c;对于项目情况了解较少&#xff0c;开发的时候发现缺失很多小图标&#xff0c;但是对原来有那些图标也不太了解 目标 1、知晓字体包里的旧的图标是什么样子的&#xff1f;2、在旧字体包中导…

图像处理与图像分析—图像统计特性的计算(纯C语言实现灰度值显示)

根据输入的灰度图像&#xff0c;分别计算图像的均值、方差等统计特征&#xff0c;并计算图像的直方图特征并以图形方式显示图像的直方图&#xff08;用C或C语言实现&#xff09;。 学习将会依据教材图像处理与图像分析基础&#xff08;C/C&#xff09;版内容展开 在上个笔记中&…

hdml接口无信号,设备管理器报错:由于该设备有问题,Windows 已将其停止。 (代码 43)

今天&#xff0c;由于带电脑外出演示系统&#xff0c;回公司突然hdml接口无信号了&#xff0c;试了同事的电脑没问题&#xff0c;所以排除显示器和线束问题&#xff0c;最后找到设备管理器报错&#xff1a;由于该设备有问题&#xff0c;Windows 已将其停止。 (代码 43)以下是排…

学生时期学习资源同步-1 第一学期结业考试题6

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载

AI短视频矩阵获客系统|罐头鱼AI视频批量混剪

AI短视频矩阵获客系统&#xff1a;智能管理&#xff0c;助力您的视频营销 如今&#xff0c;短视频已经成为企业宣传和推广的重要手段。为了满足用户对视频管理、发布和编辑的需求&#xff0c;《AI短视频矩阵获客系统》应运而生。Q:290615413这款智能化系统集成了多种功能&#…

Pandas DataFrame 写入 Excel 的三种场景及方法

一、引言 本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中&#xff0c;涉及三个不同的应用场景&#xff1a; 单个工作表写入&#xff1a;将单个 DataFrame 写入 Excel 表中&#xff1b;多个工作表写入&#xff1a;将多个 DataFrame 写入到同一个 Excel 表中的…

传统机器学习 基于TF_IDF的文本聚类实现

简介 使用sklearn基于TF_IDF算法&#xff0c;实现把文本变成向量。再使用sklearn的kmeans聚类算法进行文本聚类。 个人观点&#xff1a;这是比较古老的技术了&#xff0c;文本转向量的效果不如如今的 text2vec 文本转向量好。 而且sklearn 不支持GPU加速&#xff0c;处理大量…

交流回馈老化测试负载如何实现这些功能的

交流回馈老化测试负载是一种用于模拟电力系统中各种负载特性的装置&#xff0c;它可以对电力设备进行长时间的老化测试&#xff0c;以确保其在实际运行中的稳定性和可靠性。交流回馈老化测试负载主要通过以下几个方面实现这些功能&#xff1a; 1. 模拟负载特性&#xff1a;交流…

基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python 界面逻辑分离示例

本示例使用的发卡设备&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.6cc85700Robi3x 一、Python 安装PyQt5&#xff0c;运行 Qt Designer 新建窗体文件&#xff0c;在窗体中拖放控件 完成界面设计&#xff0c;保存为…

模拟信号隔离放大器导轨式直流信号转换器0-5V0-10V4-20mA0-75mV0-20mA负载能力0-85mA/0-165mA /0-200mA

概述 导轨安装DIN11HVI 系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相比电磁隔离具有更…

UI 设计师的工作职责是什么?需要掌握哪些技能?

什么是 UI 设计&#xff1f; UI 设计是设计用户界面的一门学科。用户界面是一个人与应用程序、网站或软件之间的联系。类似于平面设计和网页设计&#xff0c;UI 设计者是一种视觉设计师。 即时设计 - 可实时协作的专业 UI 设计工具即时设计是一款支持在线协作的专业级 UI 设计…

算法思想总结:二分查找算法

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、二分查找算法思路总结 大家先看总结&#xff0c;然后再根据后面的题型去慢慢领悟 二、二分查找&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09;二分查找 思路&#xff1a;&#xff08;模…

哪个牌子的大路灯对学生的视力好?一文带你了解大路灯

大路灯在如今市场中销量越来越高&#xff0c;与传统台灯相比&#xff0c;大路灯采用LED灯和专业的护眼技术&#xff0c;可以有效缓解用眼疲劳、帮助放松和舒适照明。但需要注意的是&#xff0c;目前市场中品牌类型较多&#xff0c;也有很多劣质的产品&#xff0c;比如网红或跨界…

吴恩达CNN之卷积初学习---二维卷积

1、卷积的实现 从左到右的矩阵可以看作&#xff1a;一幅图像、过滤器filter&#xff08;核&#xff09;、另一幅图像 编程中卷积的实现&#xff1a;支持卷积的深度学习框架都会有一些函数实现这个卷积运算 python&#xff1a;conv_forward函数 TensorFlow&#xff1a;tf.nn.…

ZStack Cloud云平台承载都江堰市人民医院核心业务

三甲医院都江堰市人民医院通过ZStack Cloud云平台对医院信息化架构进行了全面升级改造&#xff1a;一期通过ZStack Cloud云平台分布式存储&#xff0c;承载OA、短信、数字图书馆、餐厅消费系统、体检服务等一般业务&#xff1b;二期通过ZStack Cloud云平台承载医院HIS管理系统、…

18个惊艳的可视化大屏(第23辑):电子政务,一目了然如胸。

数据展示与监控&#xff1a; 可视化大屏可以将政务数据以图表、地图、仪表盘等形式展示出来&#xff0c;直观地呈现政务工作的进展、趋势和关键指标。通过大屏监控&#xff0c;政府部门可以实时了解各项指标的情况&#xff0c;及时发现问题并采取相应措施。 决策支持&#xff…

wifi的5G和3GPP的5G

wifi 5G 跑的是802.11的协议。 wifi的5G指的就是频率&#xff0c;例如wifi2.4G&#xff0c;其频段处于2.400GHz~2.4835GHz之间&#xff0c;wifi5G的频率范围为5.15GHz到5.875GHz&#xff0c;其中包括多个频道。 这里有个误区&#xff0c;并不是运行在5GHz频段的WI-FI就是5G …

鸿蒙:文本滑动选择器弹窗

根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 该组件从API Version 8开始支持 TextPickerDialog.show show(options?: TextPickerDialogOptions) 定义文本滑动选择器弹窗并弹出。 TextPickerDialogOptions参数&#xff1a; 参数名 参数类型 必填 参数…

第四百回 channel

文章目录 1. 知识回顾2. 示例代码3. 经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了…