032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期

032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期

![Untitled](https://img-
blog.csdnimg.cn/img_convert/d8293fdca54465ed4868afd111d032ca.png)

#知识点:

1、JavaEE-HTTP-Servlet技术
2、JavaEE-数据库-JDBC&Mybatis

演示案例:

➢JavaEE-HTTP-Servlet &路由&周期
➢JavaEE-数据库-JDBC&Mybatis&库

![Untitled](https://img-
blog.csdnimg.cn/img_convert/1eaaaa0dbc1cad80f0352f18cc6db3da.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/a23e39e3541100394fb81382780a9d8d.png)

#idea配置

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

![Untitled](https://img-
blog.csdnimg.cn/img_convert/146e392b27ba28fc5ad5f64def60ad47.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/85de8b78c7d895178d8359d777579de3.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/882f2493b546240797dc43b6f4efd69e.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/982192396ebf192cd442dc4bb59f5471.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/00635d064a7080aefebd81328e68790f.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/9fa7cdd83fd9fec81b91299ed56ee50a.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/6641b799c4f926b1066705facf35a004.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/20f878f7424ec51d0dd969f8346915f9.png)

#JavaEE-HTTP-Servlet&路由&周期

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

1、解释

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

2、创建和使用Servlet
1.创建一个类继承HttpServlet

![Untitled](https://img-
blog.csdnimg.cn/img_convert/dc499e09d429a03a73413d60e45c4a66.png)

2.web.xml配置Servlet路由
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    **<!-- 定义Servlet -->
    <servlet>
        <servlet-name>index</servlet-name>
        <!-- 指定Servlet类的完整路径 -->
        <servlet-class>com.example.demo1.IndexServlet</servlet-class>
    </servlet>

    <!-- 配置Servlet映射 -->
    <servlet-mapping>
        <servlet-name>index</servlet-name>
        <!-- 指定Servlet的URL映射 -->
        <url-pattern>/index</url-pattern>
    </servlet-mapping>**

</web-app>
3.WebServlet配置Servlet路由

![Untitled](https://img-
blog.csdnimg.cn/img_convert/39e75bcc16a2c525723d7f9e21c3f2ad.png)

4.写入内置方法(init service destroy doget dopost)
package com.example.demo1;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
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;

// 使用@WebServlet注解将Servlet映射到特定的URL
@WebServlet("/a")
public class IndexServlet extends HttpServlet {

    // 处理GET请求的方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("--------------doGet");

        // 从请求中获取参数"id"
        String id = req.getParameter("id");

        // 设置响应的内容类型
        resp.setContentType("text/html; charset=GBK");

        // 获取PrintWriter以将HTML响应发送给客户端
        PrintWriter out = resp.getWriter();

        // 输出从GET请求中收到的数据
        out.println("这是GET请求的数据:");
        out.println("id:" + id + "<br>");
        out.flush();
        out.close();
    }

    // 处理POST请求的方法
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从请求中获取参数"name"
        String name = req.getParameter("name");

        // 设置响应的内容类型
        resp.setContentType("text/html; charset=GBK");

        // 获取PrintWriter以将HTML响应发送给客户端
        PrintWriter out = resp.getWriter();

        // 输出从POST请求中收到的数据
        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");

        // 可以在这里添加任何初始化任务的代码
    }

    // 当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);
    }
}
  • 简单使用doGet

![Untitled](https://img-
blog.csdnimg.cn/img_convert/30112e8b5ad8cf7bf77a109f91a11dcb.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/da12af09671bb1ee8247b43290ac908f.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/6b093b53e15d0d697839d1ad45494b3d.png)

  • 简单使用doPost

    @Override
    

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 从请求参数中获取名字数据
    String name = req.getParameter(“name”);

    // 设置请求编码为UTF-8,以确保正确解析中文字符
    req.setCharacterEncoding("UTF-8");
    
    // 设置响应内容类型为text/html
    resp.setContentType("text/html");
    
    // 获取PrintWriter对象,用于向客户端发送响应数据
    PrintWriter out = resp.getWriter();
    
    // 向客户端发送提示信息,表示这是通过POST提交的数据
    out.println("这是post提交的数据");
    
    // 向客户端发送从请求参数中获取的名字数据
    out.println(name);
    
    // 在服务器端打印名字数据到控制台
    System.out.println(name);
    
    // 刷新输出缓冲区,确保数据被及时发送到客户端
    out.flush();
    
    // 关闭PrintWriter,释放资源
    out.close();
    
    // 在服务器端打印信息,表示doPost方法执行完成
    System.out.println("--------------doPost");
    

    }

![Untitled](https://img-
blog.csdnimg.cn/img_convert/6f620bfdfbadce90e33ed080ca6bf671.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/9d386337c57409b8bd4a4efa434ac17e.png)

3、Servlet生命周期

见图

![Untitled](https://img-
blog.csdnimg.cn/img_convert/a23e39e3541100394fb81382780a9d8d.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/2df58c36942e9558bcfe9846c779e3a9.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/bba822b55f62dee49e8c4856f13c0354.png)

4、处理接受和回显

HttpServletRequest(HTTP请求的信息)

  • ServletRequest的子接口 :**HttpServletRequest
    ServletRequest**接口的子接口,提供了用于处理HTTP请求的额外功能。
  • getParameter(name) :通过参数名获取请求中的值。返回一个**String**,表示与给定参数名相对应的单个值。
  • getParameterValues(name)
    :通过参数名获取请求中的多个值。返回一个**String[]**,表示与给定参数名相对应的多个值。

HttpServletResponse(HTTP响应的信息)

  • ServletResponse的子接口 :**HttpServletResponse
    ServletResponse**接口的子接口,提供了用于处理HTTP响应的额外功能。
  • setCharacterEncoding() :设置响应的字符编码格式。通常用于确保正确的文本输出。
  • setContentType() :设置响应内容的类型和编码。常用于指定输出的数据类型,如HTML、JSON等。
  • getWriter() :获取一个**PrintWriter**字符输出流,用于向客户端发送文本数据。
  • PrintWriter
    :**PrintWriter**是用于向客户端输出字符数据的类,可以接受各种数据类型,然后将其转换为文本并发送到客户端。

#JavaEE-数据库-JDBC&Mybatis&库

-原生态数据库开发:JDBC
参考:https://www.jianshu.com/p/ed1a59750127
JDBC(Java Database connectivity): **由java提供,**用于访问数据库的统一API接口规范.数据库驱动:
由各个数据库厂商提供,用于访问数据库的jar包(JDBC的具体实现),遵循JDBC接口,以便java程序员使用!

1、下载jar

![Untitled](https://img-
blog.csdnimg.cn/img_convert/ced68845820275df8e41acad9bdb2123.png)

https://mvnrepository.com/

2、引用封装jar

创建lib目录,复制导入后,添加为库

![Untitled](https://img-
blog.csdnimg.cn/img_convert/db3f35958932a7a4c2b836442347bef4.png)

![Untitled](https://img-
blog.csdnimg.cn/img_convert/44078278ee5ca8df8b0fd03462d2dc75.png)

3、注册数据库驱动

“com.mysql.jdbc.Driver”: 这是 MySQL JDBC 驱动程序的类名。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 的驱动类。

    Class.forName(“com.mysql.jdbc.Driver”);

4、建立数据库连接
// 定义数据库连接的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);

![Untitled](https://img-
blog.csdnimg.cn/img_convert/90f3e9a41e6e68ed081921fc96ac1f87.png)

5、创建Statement执行SQL
  • connection.createStatement(); 在**Connection 对象上调用createStatement 方法,创建一个Statement 对象。Statement 对象用于执行SQL语句,它可以执行静态的SQL查询、更新、删除等操作。createStatement 方法返回一个新的Statement**对象。

  • 创建一个**Statement 对象,然后使用该对象执行给定的SQL查询语句,将查询结果存储在一个ResultSet 对象中。这样,您可以通过遍历ResultSet**来检索和处理查询的结果集中的数据。

    // 创建Statement对象
    Statement statement= connection.createStatement();
    String sql=“select * from news”;
    // 执行查询,获取结果集
    ResultSet resultSet = statement.executeQuery(sql);

6、结果ResultSet进行提取
// 遍历结果集
while (resultSet.next()) {
    // 从结果集中获取每一行的数据

    // 获取整型列 "id"
    int id = resultSet.getInt("id");

    // 获取字符串列 "page_title"
    String page_title = resultSet.getString("page_title");

    // 获取字符串列 "heading"
    String heading = resultSet.getString("heading");

    // 获取字符串列 "subheading"
    String subheading = resultSet.getString("subheading");

    // 获取字符串列 "content"
    String content = resultSet.getString("content");

    // 获取字符串列 "img"
    String img = resultSet.getString("img");

    // 输出每一行的数据,以便查看结果
    System.out.println(id + "|" + page_title + "|" + heading + "|" + subheading + "|" + content + "|" + img);
}

![Untitled](https://img-
blog.csdnimg.cn/img_convert/c06c5003ccd2e250418dce7b096f94b2.png)

安全修复SQL注入:预编译

原理: 提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

![Untitled](https://img-
blog.csdnimg.cn/img_convert/5852f23d80e349105dbe3d1ed2d5eb45.png)

  1. 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ?
    是一个占位符,表示将在执行时动态替换。
  2. 使用PreparedStatement PreparedStatementStatement
    的子接口,用于执行预编译的 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 语句中。

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值