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

时间轴:

f5cd4cbdb19c4ffc9440e36c6d929ca5.png

32天主要学习内容:

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

java技术使用历史(2023 ):

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

java学习范围:     

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

框架库:MyBatis,SpringMVC,SpringBoot,Shiro , Log4j ,FastJson等技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充安全:原生开发安全,第三方框架安全,第三方库安全,待补充

JavaEE-HTTP-Servlet&路由&周期:
参考:JAVAEE的核心-Servlet_javaee的核心 csdn-CSDN博客

IDEA的安装(参考文章):http://t.csdnimg.cn/90f6s

对于idea的创建项目的使用:

tomcat安装教程:

 Tomcat安装和配置(超详细)_tomcat安装及配置教程-CSDN博客

tomcat在创建后使用:

idea配置tomcat环境(保姆级教程)_idea怎么导入tomcat运行环境-CSDN博客

idea创建后的文件介绍:

package com.example.demo1;import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {private String message;public void init() {message = "Hello World!";}public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");// HelloPrintWriter out = response.getWriter();out.println("<html><body>");out.println("<h1>" + message + "</h1>");out.println("</body></html>");}public void destroy() {}
}

1.其中java的主要内容都放在main目录中。

2.子目录com.example.demo2为创建时拥有的 。

3.运行使用的tomcat为自己下载在本地的。

tomcat的下载:

在发送的32天压缩包中自行下载。

Servlet创建和使用

Servlet的操作使用步骤如下:

public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("--------------doGet");
//        String id =req.getParameter("id");
//        resp.setContentType("utf-8");
//        resp.setContentType("text/html");
//        PrintWriter out = resp.getWriter();
//        out.println("这是GET请求的数据:");
//        out.println("id:"+id+"<br>");
//        out.flush();
//        out.close();}
}

1.使用doGet方式进行传输

2.运行使用web.xml进行(路由配置和内置配置)

3.public class IndexServlet extends HttpServlet(继承关系继承HttpServlet)

4.其中使用的HttpServlet来自于外部库的maven里的javax.servlet

路由配置:

如下为web.xml的配置:

<?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-name>IndexServlet</servlet-name><servlet-class>com.example.servletdemo.IndexServlet</servlet-class></servlet><servlet-mapping><servlet-name>IndexServlet</servlet-name><url-pattern>/index</url-pattern></servlet-mapping></web-app>

 其中的<servlet-class>的指向必须为完整路径(可以鼠标右键查看完整路径)。

<servlet-mapping>为访问路由,当访问/index时可以进行访问到文件IndexServlet。

如图为tomcat运行配置:

在部署中没有artifacts时:

Idea配置项目的tomcat时候没有Artifacts的最全解决办法_idea配置tomcat没有artifact-CSDN博客

其中可以进行运行配置url的修改(在部署栏目中进行修改)。

在实在不会的时候会写时候,可以使用fix小工具。

根据逻辑访问:http://localhost:8080/demo2_war/index

会在idea变成提示栏中显示-------doGet

如图:

如何在网页上回显?

需要在网页上使用到

​
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");PrintWriter out = resp.getWriter();out.println("name" + name);System.out.println("--------------doGet");}​

对上述代码进行分析:

String name = request.getParameter("name");理解为写一个字符串理解为name请求一个值name

Print Writer out=response.getWriter();理解为返回回显输出数据

out.printIn("name:"+name);理解为打印数据

get请求回显做测试:

访问网址:http://localhost:8080/demo2_war/index?name=1

会在下方显示idea的服务器显示   1  。

(get和post使用原理相同,若上面改为req,那下方使用也用req)

对于post请求可以

post代码:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");resp.setContentType("utf-8");resp.setContentType("text/html");PrintWriter out = resp.getWriter();out.println("这是post提交的数据");out.println(name);out.flush();out.close();System.out.println("--------------doPost");

1.使用firefox破解版(Hackbar)

在2023年第一天的解压包中

59411de809be48ada859fd19979bf81e.png

2.使用postman

基础入门第十天说过

内置测试:

可以在代码前面加入@WebServlet('/new')

@WebServlet("/new")
public class NewServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String id=req.getParameter("id");resp.setContentType("utf-8");resp.setContentType("text/html");PrintWriter out = resp.getWriter();out.println("<hr>id:"+id+"<hr>");out.flush();out.close();super.doGet(req, resp);}
}

除了doget,dopost还有init,service两个,destroy。

init代码为:

    @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);
//        }}

 service代码为:

    @Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("--------------http service");super.service(req, resp);}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {System.out.println("--------------Servlet service");super.service(req, res);}

destroy代码:

 @Overridepublic void destroy() {System.out.println("--------------destroy");super.destroy();}

  

他们执行的规律为:

6db3684888164e9e9df75cc743ef81ee.png

在访问http://localhost:8080/demo2_war/index?id=1时

init只会被执行一次之后不会再执行

destroy会在最后结束服务器的时候执行

service会执行多次

注意:

service执行在doget,dopost之上

先执行Servlet service后执行http service

丰富doget,dopost代码:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");resp.setContentType("utf-8");resp.setContentType("text/html");PrintWriter out = resp.getWriter();out.println("这是post提交的数据");out.println(name);out.flush();out.close();System.out.println("--------------doPost");

对代码进行解析:

String name = req.getParameter("name");理解为定义字符串name,给予给定值name。resp.setContentType("utf-8");编码方式设置为utf-8resp.setContentType("text/html");回显方式为text/htmlPrintWriter out = resp.getWriter();数据输出out.printIn("这是post提交的数据");页面上显示这是post提交的数据。out.printin(name);页面上输出(当给予name值时)out.flush();页面刷新out.close();关闭System.out.printIn("-------------doPsot")系统输出----------dopost

结果如下:

同理除了在web.xml里面设置,也可以在代码前面加上@WebServlet('/a')进行访问,结果一样。

JavaEE-数据库-JDBC-Mybatis-库(Hibernate):

三种数据库的对比,使用,分析:
http://t.csdnimg.cn/Cs6zH

JDBC的使用:

JavaEE-JDBC基础 - 简书

JDBC由于是java官方自带,所以不需要api接口,但需要数据库驱动jar文件

jar文件下载:
https://mvnrepository.com/

下载5.1.47.jar。之后在demo1下创建lib放入此文件。之后右键此文件然后选择为添加为库

接下来为数据库连接操作:

代码解析在JDBC的使用文章有。(也就是照着那个写的)

使用while进行循环遍历,提取出数据库中的值:

总体代码为: (注意有时候是subheading)

package com.example.demo1;import java.sql.*;public class NewsServlet {public static void main(String[] args) throws ClassNotFoundException, SQLException {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/demo1";Connection connection = DriverManager.getConnection(url, "root", "root");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);Statement statement= connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){int id = resultSet.getInt("id");String page_title = resultSet.getString("page_title");String heading = resultSet.getString("heading");String subheading = resultSet.getString("suheading");String content = resultSet.getString("content");String img = resultSet.getString("img");System.out.println(id+"|"+page_title+"|"+heading+"|"+subheading+"|"+content+"|"+img);}}}

危险写法造成后果:

//危险写法String vulsql="select * from news where id="+id;

使用union select会造成注入

预编译参考文章:

您的访问出错了

预编译简明说就是不会改变原有的逻辑

 总结遇到的问题:

main函数使用和python的main一样,和前文提到的init一样。就是使用前会被自动调用。

req的使用(需要调用service等)

req的使用需要httpservlet的调用

但单独继承调用httpservlet会造成错误:

 其中对于idea插件(plugins)安装:

推荐文章: 

 http://t.csdnimg.cn/ox6ko

http://t.csdnimg.cn/4wfAr

以上为作者安装文件。

以上由番薯小羊卷~,李豆豆喵共同完成。

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

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

相关文章

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…

k8s,声明式API对象理解

命令式API 比如&#xff1a; 先kubectl create&#xff0c;再replace的操作&#xff0c;我们称为命令式配置文件操作 kubectl replace的执行过程&#xff0c;是使用新的YAML文件中的API对象&#xff0c;替换原有的API对象&#xff1b;而kubectl apply&#xff0c;则是执行了一…

【金猿CIO展】复旦大学附属中山医院计算机网络中心副主任张俊钦:推进数据安全风险评估,防范化解数据安全风险,筑牢医疗数据安全防线...

‍ 张俊钦 本文由复旦大学附属中山医院计算机网络中心副主任张俊钦撰写并投递参与“数据猿年度金猿策划活动——2024大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数据要素时代&#xff0c;医疗数据已成为医院运营与决策的重要基石…

案例研究|HYPER PaaS低代码工具携手DataEase嵌入式版,服务工业制造企业数智化转型

杭州星瀚智磐科技有限公司&#xff08;以下简称为“星瀚智磐”&#xff09;成立于2021年&#xff0c;是一家专注于低代码平台研发的高科技企业。星瀚智磐的核心产品HYPER PaaS低代码工具主要为制造业用户提供数字化解决方案。HYPER PaaS基于低代码平台简单的拖拉拽操作&#xf…

2-2-18-13 QNX系统架构之原生网络(Qnet)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…

Ubuntu系统上mysql服务部署

前段时间搞了一个mysql服务端的部署&#xff0c;在Ubuntu系统上&#xff0c;中间也踩了许多坑&#xff0c;特此记录下。 下载 官网&#xff1a;MySQL :: MySQL Community Downloads 这个里面有不同系统的安装包&#xff0c;根据自己的系统选择&#xff0c;我选了 MySQL Com…

IIC相关介绍及oled实验(二)

//模块&#xff1a;OLED显示屏 1. 0.96寸OLED屏幕介绍 0.96 寸 4P OLED 屏幕模块是一种显示屏模块&#xff0c;它包括一个 0.96 英寸的 OLED 显示屏和四个引脚。这种 OLED 屏幕模块通常用于嵌入式系统和小型电子设备中&#xff0c;可以显示文本、图像和其他类型的信息。由于其…

【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)

一、包含指标&#xff1a; 股票代码 股票代码 股票简称 年份 所属城市 直辖市&#xff1a;企业所在地是否属于直辖市。1是&#xff0c;0否。 副省级城市&#xff1a;企业所在地是否属于副省级城市。1是&#xff0c;0否。 省会城市&a…

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变&#xff08;Radial Distortion&a…

Golang内存模型总结1(mspan、mcache、mcentral、mheap)

1.内存模型 1.1 操作系统存储模型 从上到下分别是寄存器、高速缓存、内存、磁盘&#xff0c;其中越往上速度越快&#xff0c;空间越小&#xff0c;价格越高。 关键词是多级模型和动态切换 1.2 虚拟内存与物理内存 虚拟内存是一种内存管理技术&#xff0c;允许计算机使用比…

Qt Quick开发基础+实战(持续更新中…)

最近更新日期&#xff1a;2024/12/4 一、Qt Quick简介 写在前面&#xff1a; 本篇文章虽然只是作为我的学习笔记&#xff0c;但也作为我日后复习之用&#xff0c;所以会认真并详细记录&#xff0c;但会分重点。 1.3 新建Qt Quick Application工程 这节主要讲2个知识点&#x…

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…

使用GDI对象绘制UI时需要注意的若干细节问题总结

目录 1、一个bitmap不能同时被选进两个dc中 2、CreateCompatibleDC和CreateCompatibleBitmap要使用同一个dc作为参数 3、不能删除已经被选入DC中的GDI对象 4、使用完的GDI对象&#xff0c;要将之释放掉&#xff0c;否则会导致GDI对象泄漏 5、CreateCompatibleBitmap返回错…

基于频谱处理的音频分离方法

基于频谱处理的音频分离方法 在音频处理领域&#xff0c;音频分离是一个重要的任务&#xff0c;尤其是在语音识别、音乐制作和通信等应用中。音频分离的目标是从混合信号中提取出单独的音频源。通过频谱处理进行音频分离是一种有效的方法&#xff0c;本文将介绍其基本原理、公…

Java项目实战II基于微信小程序的电子竞技信息交流平台的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的飞速发展…

【机器学习】—Transformers的扩展应用:从NLP到多领域突破

好久不见&#xff01;喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 &#xff08;一&#xff09;、核心组件 &#xff08;二&#xff09;、架构图 二、领域扩展&#xff1a;从NLP到更多场景 1. 自然语言处理&#xff08;NLP&#xff09; 2…

Linux 文本处理三剑客基本用法

Linux文本处理三剑客 - grep sed awk 1. 基本用法 grep 是一种强大的文本搜索工具&#xff0c;用于在文件中搜索指定的模式&#xff08;通常是字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。以下是 grep 的一些基本用法&#xff1a; 基本语法 grep [选项] 模式…

解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204

&#x1f6e0;️ 解决 Maven 部署中的 Artifact 覆盖问题&#xff1a;实战经验分享 &#x1f4cc; 引言 在软件开发过程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具&#xff0…

3DMAX星空图像生成器插件使用方法详解

3DMAX星空图像生成器插件&#xff0c;一键生成星空或夜空的二维图像。它可用于创建天空盒子或空间场景&#xff0c;或作为2D艺术的天空背景。 【主要特点】 -单击即可创建星空图像或夜空。 -星数、亮度、大小、形状等参数。 -支持任何图像大小&#xff08;方形&#xff09;。…

Linux权限机制深度解读:系统安全的第一道防线

文章目录 前言‼️一、Linux权限的概念‼️二、Linux权限管理❕2.1 文件访问者的分类&#xff08;人&#xff09;❕2.2 文件类型和访问权限&#xff08;事物属性&#xff09;✔️1. 文件类型✔️2. 基本权限✔️3. 权限值的表示方法 ❕2.3 文件访问权限的相关设置方法✔️1. ch…