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

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

Untitled

#知识点:

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

演示案例:

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

Untitled

Untitled

#idea配置

1.打开idea

2.创建javaEE项目

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

4.下载JDK1.8稳定版

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

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

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

Untitled

#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

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><!-- 指定ServletURL映射 --><url-pattern>/index</url-pattern></servlet-mapping>**</web-app>
3.WebServlet配置Servlet路由

Untitled

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请求的方法@Overrideprotected 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请求的方法@Overrideprotected 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首次创建时调用的初始化方法@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("--------------init");// 可以在这里添加任何初始化任务的代码}// 当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);}
}
  • 简单使用doGet

Untitled

Untitled

Untitled

  • 简单使用doPost

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 从请求参数中获取名字数据String name = req.getParameter("name");// 设置请求编码为UTF-8,以确保正确解析中文字符req.setCharacterEncoding("UTF-8");// 设置响应内容类型为text/htmlresp.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

Untitled

3、Servlet生命周期

见图

Untitled

Untitled

Untitled

4、处理接受和回显

HttpServletRequest(HTTP请求的信息)

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

HttpServletResponse(HTTP响应的信息)

  • ServletResponse的子接口:**HttpServletResponseServletResponse**接口的子接口,提供了用于处理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://mvnrepository.com/

2、引用封装jar

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

Untitled

Untitled

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/databaseString url = "jdbc:mysql://localhost:3306/dome01";// 使用DriverManager获取数据库连接Connection connection = DriverManager.getConnection(url, "root", "root");// 打印数据库连接信息System.out.println(connection);

Untitled

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

安全修复SQL注入:预编译

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

Untitled

  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 语句中。

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

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

相关文章

RK356X RKAndroid12 TF卡配置 自动挂载

RK356X RKAndroid12 TF卡配置 自动挂载 RK3568 有三个SDMMC接口&#xff0c;分别为SDMMC0 SDMMC1 SDMMC2 DTS 配置 1. max-frequency <150000000>; 此配置设置 SD 卡的运行频率&#xff0c;虽然设置为 150M &#xff0c;但是还要根据 SD 卡的不同模式进行调整。这…

Java项目管理01-Maven基础

一、Maven的常用命令和生命周期 1.Maven的常用命令使用方式 complie&#xff1a;编译&#xff0c;将java文件编译为class字节码文件 clean&#xff1a;清理&#xff0c;删除字节码文件 test&#xff1a;测试&#xff0c;运行项目中的test类 package&#xff1a;打包&#x…

堪称灾难级攻击的 UDP FLOOD洪水攻击,应该如何防护?

DDOS又称为分布式拒绝服务&#xff0c;全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载&#xff0c;导致服务不可用&#xff0c;从而造成服务器拒绝正常流量服务。就如酒店里的房间是有固定的数量的&#xff0c;比如一个酒店有50个房间&#xff0c;当…

如何彻底卸载MySQL【可以解决问题】

[序]写在前面 相信很多小伙伴都遇到了以前版本的MySQL没有卸载干净而导致新版本的MySQL无法安装的情况&#xff0c;今天小编带你彻底解决这个令人头痛的问题&#xff08;本人也有亲身经历&#xff01;希望能够给大家带来一点点帮助&#xff09; 注&#xff1a;本文部分图片来自…

Django的web框架Django Rest_Framework精讲(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置&#xff08;1&#xff09;DRF需要以下依赖&#xff08;2&#xff09;创建django项目 4.序列化器的使用&#xff08;1&#xff09;创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…

Java实现批量视频抽帧2.0

继上个版本 对其进行略微升级 &#x1f913; 上个版本仅对一个视频进行抽帧处理 此版本可对一个文件夹内的全部视频进行抽帧并对应的文件夹进行帧图片的保存 1️⃣配置pom.xml &#xff08;保持上次不变&#xff09; <dependencies><dependency><grou…

企业在什么情况下需要一款固定资产管理系统?

在现代商业环境中&#xff0c;企业的固定资产是其运营和发展的重要基础。然而&#xff0c;许多企业在固定资产管理方面面临着挑战&#xff0c;如信息不准确、效率低下和资源浪费等问题。为了解决这些问题&#xff0c;越来越多的企业开始意识到引入一款固定资产管理系统的重要性…

网络异步编程

网络异步编程 一、tcp连接的状态 LISTEN&#xff1a;服务端状态&#xff0c;等待客户端发起连接请求SYN_SENT&#xff1a;客户端已发送同步连接请求&#xff0c;等待服务端相应SYN_RECEIVED&#xff1a;服务器收到客户端的SYN请请求&#xff0c;并发送自己的SYN响应&#xff…

java仓库进销存商品库存管理系统springboot+vue

库存管理信息系统研究的内容涉及库存管理的全过程&#xff0c;包括入库、出库、退 货、订货、库存统计查询等等。 根据上述工作流程&#xff0c;库存管理系统将包含以下内容 1&#xff09;登录信息的输入&#xff0c;密码的修改。 2&#xff09;基本信息的输入&#xff0c;包括…

部门管理的主要内容:从目标设定到团队发展的全面指南

部门管理是指对一个组织机构中的各个部门进行协调、规划和管理的过程。部门管理的主要内容包括以下几个方面&#xff1a;部门目标和职责的规划、部门人员的管理、部门绩效的评估和监控、部门之间的协调和沟通、部门文化和价值观的塑造。下面为大家具体介绍这些内容 1、部门目标…

自学网安-IIS服务器

部署环境&#xff1a;win2003 配置环境&#xff1a;winxp ip&#xff1a;10.1.1.2 win2003 ip&#xff1a;10.1.1.1 开始安装 双击“应用程序服务器” 双击“Internet 信息服务&#xff08;IIS&#xff09;” 勾选万维网服务&#xff0c;确定然后下一步 查看端口号;netstat …

ConcurrentHashMap的使用以及源码分析

一、ConcurrentHashMap&#xff1f; 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CASsynchronized实现的线程安全 CAS&#xff1a;在没有hash冲突时&#xff08;Node要放在数组上时&#xff09; synchronized&#xff1a;在出现ha…

Java 日期时间相互转换 格式化输出

Java 日期时间相互转换 格式化输出 package com.zhong.time;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class SimpleDateFormatTest {public static void main(String[] args) throws ParseException {Date date n…

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…

设计模式1-访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许你定义在对象结构中的元素上进行操作的新操作&#xff0c;而无需修改这些元素的类。这种模式的主要思想是将算法与元素的结构分离开&#xff0c;使得可以在不修改元素结构的情况下定义新的操作。 所谓算法与元素结构分离&#x…

极速上手:使用Jmeter轻松实现N种参数化

参数化的方式&#xff1a; 一、使用用户自定义变量 一种方式&#xff1a;直接在测试计划中添加用户自定义变量 另外一种方式&#xff1a;配置元件——用户自定义变量 示例&#xff1a;用户自定义变量&#xff0c;登录手机号码 在接口请求的时候&#xff0c;进行引用 请求之后&…

32ADC模数转换器&AD单通道&多通道

目录 一.简介 二.逐次逼近法​编辑 三.结构框图 四.小tips (1)转换模式 &#xff08;2&#xff09;触发控制 &#xff08;3&#xff09;数据对齐 &#xff08;4&#xff09;转换时间 &#xff08;5&#xff09;校准 &#xff08;6&#xff09;硬件电路 五.相关函数 …

vue使用es的reduce方法编译报错Error: Can‘t resolve ‘core-js/modules/es.array.reduce.js‘

哈喽 大家好啊 最近在vue使用es的reduce方法编译报错Error: Cant resolve core-js/modules/es.array.reduce.js 报错如图所示&#xff1a; 解决方案&#xff1a; npm install --save core-js 然后重新编译下将正常了 参考原文: 使用import异步加载语法报错_module not foun…

Android Split APK介绍

文章目录 Split APKSplit APK 详细介绍概念Android App Bundle&#xff08;AAB&#xff09;Split APK 的优势动态分发减小安装包大小模块化和渠道分发 Split APK 的类型基于屏幕密度### 基于 CPU 架构基于语言 实现 Split APK Split APK Split APK 是 Android 中一种应用程序安…

SpringBoot实战第二天

今日战报 继续完善用户相关接口开发&#xff1a; 1.完成获取用户信息功能 2.完成更新用户信息功能 3.完成更新用户头像功能 4.完成更新用户密码功能 获取用户信息 接口文档 如接口文档所示&#xff0c;我们需要做的就是从header中的Authorization中读取token&#xff0c;解码…