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

news2024/12/27 7:45:04

时间轴:

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");

        // Hello
        PrintWriter 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 {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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代码为:

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

    }

 service代码为:

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("--------------http service");
        super.service(req, resp);
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("--------------Servlet service");
        super.service(req, res);
    }

destroy代码:

 @Override
    public 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-8

resp.setContentType("text/html");回显方式为text/html

PrintWriter 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.coloradmin.cn/o/2253481.html

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

相关文章

【大数据技术基础】 课程 第3章 Hadoop的安装和使用 大数据基础编程、实验和案例教程(第2版)

第3章 Hadoop的安装和使用 3.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台&#xff0c;为用户提供了系统底层细节透明的分布式基础架构。Hadoop是基于Java语言开发的&#xff0c;具有很好的跨平台特性&#xff0c;并且可以部署在廉价的计算机集群中。H…

VTK中矩阵vtkMatrix4x4类的介绍和使用

1、矩阵-齐次坐标介绍 常见的点一般是Pt&#xff08;X,Y,Z&#xff09;&#xff0c;相当于一个13矩阵&#xff0c;而矩阵相乘的话一般是第一个矩阵的列数要等于第二个矩阵的行数。此处需要引入齐次坐标的概念&#xff1a;从广义上讲&#xff0c;齐次坐标就是用n1维向量表示n 维…

RoGS: Large Scale Road Surface Reconstruction based on 2D Gaussian Splatting

RoGS 摘要简介RoGS基于高斯面元的道路表面表示(Road Surface Representation Based on Guassian Surfel)2D Gaussian Surfel:Road Surface Modeling:Why use 2D Gaussian Surfels? 基于轨迹的初始化&#xff08;Trajectory-base Initialization&#xff09;优化&#xff08;Op…

使用 postman 传递 binary 类型的图片到后端接口遇到的坑

使用 psotman 传 binary 类型图片报错&#xff1a; -2024-12-04 [http-nio-9090-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required r…

微服务通讯系统(2)

软件设计及核心代码展示 数据库表设计&#xff0c;ES搜索表设计&#xff0c;Redis键值对设计 数据库表设计 &#xff08;1&#xff09;用户表设计 这里的ID是指的是在系统中用户是第几个注册的&#xff08;从1开始&#xff09; user_id是指用户的唯一ID是通过uuid()函数生成…

修复docker启动失败:Failed to start Docker Application Container Engine

配置了镜像源之后&#xff0c;运行sudo systemctl restart docker.service失败&#xff0c;提示让运行systemctl status docker.service或journalctl -xeu docker.service查看详细信息。 运行后者发现有如下日志&#xff1a; 红色区域是我设置的一个镜像源这个日志的意思就是…

神经网络入门实战:(十四)pytorch 官网内置的 CIFAR10 数据集,及其网络模型

(一) pytorch 官网内置的网络模型 图像处理&#xff1a; Models and pre-trained weights — Torchvision 0.20 documentation (二) CIFAR10数据集的分类网络模型&#xff08;仅前向传播&#xff09;&#xff1a; 下方的网络模型图片有误&#xff0c;已做修改&#xff0c;具…

微信小程序wx.showShareMenu配置全局分享功能

在app.js文件中配置如下即可&#xff1a; onLaunch() {//开启分享功能this.overShare()},/*** 开启朋友圈分享功能* 监听路由切换/自动执行*/overShare() {wx.onAppRoute((res) > {// console.log(route, res)let pages getCurrentPages()let view pages[pages.length - …

Java刷题常见的集合类,各种函数的使用以及常见的类型转化等等

前言 相信大家在刷算法题的过程中&#xff0c;好不容易想出来大概的思路&#xff0c;也知道去用哪个集合类&#xff0c;但各个集合类的一些命令都长得太像&#xff0c;很容易将他们弄错&#xff0c;并且在各集合之间的转化也是特别烦人&#xff0c;还有很多实用的函数都知道可…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…

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

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

计算机视觉——相机标定(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…

Go学习:编译器(编写程序时应该注意的点)

一、注意&#xff1a; LiteIDE工具&#xff1a; &#xff08;1&#xff09;创建项目后&#xff0c;同一个目录下的go文件 只能有一个 main函数&#xff0c;如果多个文件都有main函数&#xff0c;会出现编译错误。例如&#xff1a; &#xff08;2&#xff09;如果一个目录下多…

【计算机网络】实验9: 路由信息协议RIP

实验9 路由信息协议RIP 一、实验目的 本实验的主要目的是深入理解RIP&#xff08;路由信息协议&#xff09;的工作原理&#xff0c;以便掌握其在网络中的应用。通过对RIP的学习&#xff0c;我们将探讨该协议如何实现路由选择和信息传播&#xff0c;从而确保数据包能够在网络中…

如何选择适合的开源架构框架

如何选择适合的开源架构框架 一、引言二、明确项目需求 —— 筑牢基石&#xff08;一&#xff09;功能需求剖析 —— 精准锁定核心&#xff08;二&#xff09;性能要求考量 —— 追求极致卓越&#xff08;三&#xff09;可扩展性需求 —— 放眼未来蓝图 三、评估开源框架特性 —…

MongoDB-BSON 协议与类型

前言&#xff1a; MongoDB 是一个高性能、无模式的 NoSQL 数据库&#xff0c;广泛应用于大数据处理和实时数据存储。作为一个数据库系统&#xff0c;MongoDB 的核心之一就是其使用的 BSON&#xff08;Binary JSON&#xff09;格式&#xff0c;它用于存储数据以及在客户端和数据…

jmeter如何导出中文版的测试报告?

文章目录 0、初始步骤&#xff1a;把报告模板换成中文形式1、首先添加一份聚合报告2、然后点开【聚合报告】3&#xff0c;生成报告3.1 选择【工具】-【generate HTML report】3.2 【generate HTML report】参数详解3.3 、最后点击 【generate report】直接生成。 声明&#xff…

等差数列末项计算

等差数列末项计算 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给出一个等差数列的前两项a1&#xff0c;a2&#xff0c;求第n项是多少。 输入 一行&#xff0c;包含三个整数a1&#xff0c;a2&#x…

芯科科技突破性超低功耗Wi-Fi 6和低功耗蓝牙5.4模块加速设备部署

致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;今日宣布推出SiWx917Y超低功耗Wi-Fi 6和低功耗蓝牙&#xff08;Bluetooth LE&#xff09;5.4模块。 作为成功的第二代无线开发平台的新产品&…

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

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