java代码审计2之servlet学习(1)

本文详细介绍了Servlet的基本概念、作用,以及在JSP后门清理中的注意事项。讨论了Servlet的路由配置,包括注解和web.xml的方式,并阐述了Tomcat如何处理未明确配置的文件。此外,文章深入讲解了Servlet的生命周期,包括init、service、destroy方法的调用时机,并通过实例展示了它们的工作过程。最后,文章探讨了GET和POST请求参数的传递方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、基本知识

1.1、Servlet

1、Servlet 是什么?

Servlet(Server Applet)是Java Servlet的简称,称为⼩服务程序或服务连接器,
	
⽤Java编写的服务器端程序,具有独⽴于平台和协议的特性, 
	
是运⾏在 Web 服务器或应⽤服务器上的程序。

2、Servlet 的作⽤

它是作为来⾃ Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应⽤程序之间的中间层。

主要功能在于收集来⾃⽹⻚表单的⽤户输⼊,交互式地浏览和⽣成数据,还可以⽣成动态Web内容。

3、个人的理解

前端提交数据		--》		server		--》具体的代码逻辑

1.2、番外之jsp后门清理注意

新建一个jsp文件,执行代码后,访问这个jsp文件

这里直接复制index.jsp

在这里插入图片描述

运行程序,会在“Using CATALINA_BASE”文件下生成两个对应的文件(java/class)

具体路径为,

%Using CATALINA_BASE%\work\Catalina\localhost\ROOT\org\apache\jsp

在这里插入图片描述

假设这个test.jsp是后门的话,攻击者访问下这个test.jsp文件,就会生成(java/class)

在这里插入图片描述

最开始以为需要以下三步才会清理干净,

	删除test.jsp后,同时删除上边两个生成的对应文件,最后重启容器

经过测试发现,只需要删除test.jsp之后,重启tomcat容器即可
	
	生成的(java/class)会被自动清理

2、路由相关

2.1、注解

Servlet3.0⾥引⼊了注解;注解@WebServlet⽤来定义Web应⽤程序中的⼀个Servlet。  

@WebServlet⽤来注册Servlet;name是Servlet的名字;value是通过请求的url地址

以下代码的意思是,通过访问/hello-servlet访问HelloServlet

在这里插入图片描述

这个value的值可以任意,比如,下边通过

"/hello", "/aaa.php"来访问这个文件,

在这里插入图片描述

2.2、web.xml

除了上边的注解方式,还可以通过配置web.xml来设置路由

具体的配置在src/main/webapp/WEB-INF/web.xml
   
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.example.demo.HelloServlet</servlet-class>
    </servlet>
      
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>


      server-name是设计一个联系的纽带
      server-class是具体指向哪个class文件
    	url-pattern是直接对应的路由
      

在这里插入图片描述

当注解有web.xml的文件冲突时,以web.xml为准;注解会直接失效

即当注解也加了路由,web.xml也加了路由的情况,路由路径还不一样

在这里插入图片描述

2.3、tomcat默认的server

这里一个问题是以下这个文件既没有找到注解,也没有web.xml配置,但是可以直接访问

src/main/webapp/index.jsp

在这里插入图片描述

直接的记录是,webapp目录下的文件可以直接访问,但是不明白为什么,

其根本原因是,tomcat默认自带的server解析的,

apache-tomcat-9.0.68\conf\web.xml

这个文件内有一些server与servlet-mapping的映射

3、servlet生命周期

3.1、简述过程

三个步骤即:初始化------>处理请求------>销毁 
创建Servlet对象后
  
  		---------->初始化(调⽤ init () ⽅法)
  	
  		--------->处理/响应客户端的请求(调⽤ service() ⽅法)
  		
  		--------->销毁(调⽤ destroy() ⽅法,

  最后由 JVM 的垃圾回收器进⾏垃圾回 收)  

init方法,

只会在第⼀次创建 Servlet 时被调⽤,在后续每次⽤户请求时不再调⽤

init可以初始化一些变量,比如mysql的链接信息等

service() ⽅法

每次服务器接收到⼀个 Servlet 请求时,都会调用该方法

destroy() ⽅法

在⻓时间没有被调⽤或者是服务器关闭时,会调⽤destroy()⽅法来销毁Servlet对象


destroy() ⽅法只会被调⽤⼀次,在 Servlet ⽣命周期结束时被调⽤。


destroy() ⽅法可以让Servlet 关闭数据库连接、停⽌后台线程、

把 Cookie 列表或点击计数器写⼊到磁盘,并执⾏其他类似的清理活动。 

在调⽤ destroy() ⽅法之后,servlet 对象被标记为垃圾回收。  

3.2、测试init、service、destroy

新建一个java文件,名称任意,

在这里插入图片描述

将新建的类继承Servlet类接口,

将鼠标放到放到“class”或者“test”上,将下边的方法都实现,

在这里插入图片描述

现在将上边描述的三个方法都增加一下输出,

在这里插入图片描述
增加注解,
在这里插入图片描述

启动项目,

此时没有访问test,所以下边没有任何输出,

在这里插入图片描述

访问test路由,

init方法和service方法被执行,

在这里插入图片描述

多次访问/刷新test路由,init方法不在执行,server则访访问一次,执行一次

在这里插入图片描述

当我们手动终止项目的时候,

destroy方法被执行,

在这里插入图片描述

3.3、初始化之注解

      	@WebServlet(value = "/test",initParams={@WebInitParam(name="username",value="xbb"),@WebInitParam(name="age",value="20")})

		String username = servletConfig.getInitParameter("username");
        int age = Integer.parseInt(servletConfig.getInitParameter("age"));
        System.out.println("username: "+username+"age: "+age);

3.4、初始化之web.xml

上边是通过注解来初始化,下边通过web.xml
    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>com.example.demo.test</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>xbb</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>18</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test11</url-pattern>
    </servlet-mapping>

在这里插入图片描述

值得一提的是,假设通过注解的方法也同时存在时,

这两个路由会同时生效,

在上边测试,没有初始化参数的时候,当web.xml与注解同时出现的话,注解会失效,

但是当都存在初始化参数的时候,两个都生效

在这里插入图片描述
但是假设当注解和web.xml声明的路由相同时,会直接报错,
在这里插入图片描述

4、servlet请求与响应

先看下最初的,在init内定义了一个变量,

doget进行输出,

在这里插入图片描述

4.1、get传参

index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="aaa.php?username=xbb&age=20">get传输参数</a><br>

<%--<form action="/aaa.php" method="post">--%>
<%--    账号:<input name="username" type="text"><br>--%>
<%--    年龄:<input name="age" type="text"><br>--%>
<%--    兴趣:--%>
<%--    <input type="checkbox" name="hobby" value="song">唱--%>
<%--    <input type="checkbox" name="hobby" value="jump">跳--%>
<%--    <input type="checkbox" name="hobby" value="rap">rap--%>
<%--    <input type="submit" value="提交">--%>
<%--</form>--%>

</body>
</html>

HelloServlet

package com.example.demo;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value ={"/hello", "/aaa.php"})// "/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.setCharacterEncoding("utf-8"); //如果有中乱码可以设置接收编码utf-8

        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(String.format("前端传输过来的参数 username = %s age = %s",username,age));


        response.setContentType("text/html");
        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>传输完成</h1>");
        out.println("</body></html>");
    }










    public void destroy() {
    }
}

测试访问,
在这里插入图片描述
点击后,
在这里插入图片描述

4.2、POST传参

index.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<%--<a href="aaa.php?username=xbb&age=20">get传输参数</a><br>--%>

<form action="/aaa.php" method="post">
    账号:<input name="username" type="text"><br>
    年龄:<input name="age" type="text"><br>
    兴趣:
    <input type="checkbox" name="hobby" value="song"><input type="checkbox" name="hobby" value="jump"><input type="checkbox" name="hobby" value="rap">rap
    <input type="submit" value="提交">
</form>

</body>
</html>

HelloServlet

package com.example.demo;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value ={"/hello", "/aaa.php"})// "/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.setCharacterEncoding("utf-8"); //如果有中乱码可以设置接收编码utf-8

        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(String.format("前端传输过来的参数 username = %s age = %s",username,age));

        response.setContentType("text/html");
        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>传输完成</h1>");
        out.println("</body></html>");
    }










  	//关注点
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("utf-8"); //如果有中乱码可以设置接收编码utf-8

        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(String.format("前端传输过来的参数 username = %s age = %s",username,age));

        //接受参数集合
        String[] hobbys = request.getParameterValues("hobby");
        for (String s : hobbys) {
            System.out.println(s);
        }


        response.setContentType("text/html");
        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>post请求完成</h1>");
        out.println("</body></html>");
    }



          

    public void destroy() {
    }
}

访问首页,
在这里插入图片描述
提交信息,
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

划水的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值