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

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

#知识点:

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

演示案例:

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

#idea配置

1.打开idea

2.创建javaEE项目

3.项目模板选用Web程序,创建Tomcat服务器

4.下载JDK1.8稳定版

5.选择javaEE 8创建项目即可

6.点击运行,即可看到网页页面

#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
2.web.xml配置Servlet路由
java 复制代码
<?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路由
4.写入内置方法(init service destroy doget dopost)
java 复制代码
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
  • 简单使用doPost

    java 复制代码
    @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");
    }

3、Servlet生命周期

见图

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

https://mvnrepository.com/

2、引用封装jar

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

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 的驱动类。
java 复制代码
Class.forName("com.mysql.jdbc.Driver");

4、建立数据库连接

java 复制代码
// 定义数据库连接的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**来检索和处理查询的结果集中的数据。
java 复制代码
// 创建Statement对象
Statement statement= connection.createStatement();
String sql="select * from news";
// 执行查询,获取结果集
ResultSet resultSet = statement.executeQuery(sql);

6、结果ResultSet进行提取

java 复制代码
// 遍历结果集
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);
}

安全修复SQL注入:预编译

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

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

相关推荐
用户962377954485 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主6 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954487 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机8 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机8 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954488 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star8 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954488 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher9 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行12 天前
网络安全总结
安全·web安全