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

时间轴:

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创建后的文件介绍:

java 复制代码
package com.example.demo;

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.demo为创建时拥有的 。

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

tomcat的下载:

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

Servlet 创建和使用**:**

Servlet的操作使用步骤如下:(先创建一个IndexServlet在com.example.demo下):

Servlet创建:

代码改为Httpservlet,因为作者引用错误。

HttpServlet:

java 复制代码
package com.example.demo;


import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        System.out.println("--------------doGet");
    }
}

解释:

1.使用doGet方式进行传输

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

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

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

5.对于没写的调用包,可以将鼠标放在上面使用alt+enter。

路由配置:

如下为web.xml的配置:

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-name>IndexServlet</servlet-name>
            <servlet-class>com.example.demo.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

如图:

如何在网页上回显?

需要在网页上使用到

java 复制代码
​package com.example.demo;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws 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代码:

java 复制代码
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String name = req.getParameter("name");
        System.out.println(name);
        System.out.println("--------------doPost");
    }

1.使用firefox破解版(Hackbar)

在2023年第一天的解压包中

2.使用postman

基础入门第十天说过

内置测试:

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

这样就可以省去路由配置在web.xml中进行调用了(和之前一样)。

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

java 复制代码
package com.example.demo;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/new")
public class NewServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("--------------NewServlet doGet");
    }
}

效果:

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

init代码为:

java 复制代码
    @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代码为:(两个)

java 复制代码
    @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代码:

java 复制代码
 @Override
    public void destroy() {
        System.out.println("--------------destroy");
        super.destroy();
    }

总代码:

java 复制代码
package com.example.demo;


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

@WebServlet("/new")
public class NewServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("--------------NewServlet doGet");
    }


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

    }

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

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

执行对比图:

他们执行的规律为:

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

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

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

service会执行多次

注意:

service执行在doget,dopost之上

先执行Servlet service后执行http service再执行doGet

丰富doget,dopost代码:

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

对代码进行解析:

java 复制代码
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)

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

}

危险写法造成后果:

java 复制代码
//危险写法
        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

以上为作者安装文件。

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

相关推荐
鱼大大博客18 分钟前
Edge SCDN 边缘安全加速有什么用?
前端·安全·edge
网络研究院3 小时前
如何选择安全、可验证的技术?
网络·安全·技术·验证·数字·采购
黑客Ela3 小时前
安全防御之备份恢复技术
服务器·数据库·安全
黑客-秋凌3 小时前
网络安全 与 加密算法
安全·web安全
网络安全Max4 小时前
网络安全面试题及经验分享
经验分享·安全·web安全
深圳讯鹏科技4 小时前
汽车零部件工厂的ESD静电防护安全解决方案
安全·汽车
web151173602234 小时前
微服务安全——OAuth2.1详解、授权码模式、SpringAuthorizationServer实战、SSO单点登录、Gateway整合OAuth2
安全·微服务·gateway
qq_243050799 小时前
dnsmap:DNS枚举 详细完整教程 Kali Linux&Termux入门教程 黑客渗透测试 信息收集
linux·网络·安全·web安全·网络安全·系统安全·ddos
网络安全(华哥)10 小时前
系统安全——访问控制访问控制
安全·系统安全