什么servletServlet是Java EE/Jakarta EE规范的一部分,运行在Servlet容器(如Tomcat)中,是运行在 Web 服务器或应用服务器上的 Java 程序,它充当了 Web 客户端(如浏览器)与服务器上应用程序之间的中间层,通过"请求-响应"模型与客户端交互。狭义上指Java语言实现的Servlet接口,广义上指任何实现该接口的类。要使用它实现web应用,需要如下步骤:
1.创建Servlet类:继承HttpServlet类,并重写doGet()或doPost()等方法处理请求。
2.配置Servlet:在web.xml中配置Servlet的映射,或者使用注解(如@WebServlet)。
3.部署到Servlet容器:将编译后的Servlet类文件放在Web应用的WEB-INF/classes目录下,并将Web应用部署到Servlet容器(如Tomcat)中。
4.通过浏览器或客户端访问:根据配置的URL模式访问Servlet
Servlet运行流程:
1.客户端发送请求:例如,浏览器发送HTTP请求。
2.容器接收请求:Servlet容器(如Tomcat)解析HTTP请求,并根据URL找到对应的Servlet。
3.容器创建Servlet实例:如果该Servlet还没有被创建,容器会加载Servlet类并创建实例,然后调用init()方法初始化。
4.容器调用service()方法:根据请求类型(GET、POST等)调用相应的doGet()或doPost()方法。
5.Servlet处理请求:在doGet()或doPost()方法中编写处理逻辑,生成响应内容。
6.容器发送响应:将Servlet生成的响应返回给客户端。
7.容器销毁Servlet:当容器需要回收资源时(如容器关闭),会调用destroy()方法销毁Servlet
示例:-启动注册自己的servlet创建web项目首先使用idea创建一个web应用,大致的文件结构是这样的:
pom.xml文件内容:引入相关的依赖就可以开始了
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
在java目录下创建一个自己的servlet:代码狠简单,只是打印一句话。开头已经介绍了创建servLet的方法。
package com.ex;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServerLet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
resp.getWriter().println("My servlet");//HttpServletResponse resp获取一个 PrintWriter 对象,该对象能够向客户端(通常是浏览器)输出字符文本数据,直接调用 print() 或 println() 方法输出字符串内容
}
}
现在有了servLet,开始注册servLet,让他可以被我们通过web访问:配置tomcat,如果使用spring可省略此步骤:tomcat自行下载!
然后配置web.xml文件,内容如下:关键地方做了注释!
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">
这样就相当于在web中将test路径,与ServerLet形成了映射关系,当我们启动应用的时候,tomcat会自动加载ServerLet类到JVM内存中。当访问/test,就会执行ServerLet的doGet()方法,看名字就知道这个方法是处理get请求,对应的有doPost()。现在运行一下:
成功执行了我们自己的servLet类中的doGet()方法,输出了对应的内容。
现在我们运行起了应用,自己的servLet也注册到内存中了,现在将servLet文件,以及它的.class文件都删掉之后,再次访问,依然可以访问到test页面。这就是注册到内存中的意思:即便是文件不在了,但是类已经加载到jvm中,不在依赖实际文件,也可以访问对应的类对象。这是静态注册的(依靠web.xml文件)----一旦服务重启,将失效。
比如删掉对应的servLet文件之,重启服务之后,再次访问:可能出现下面两种情况:
内存马就是利用上面的流程实现的。但却是通过动态注册servlet实现的。上面是启动时注册的过程。
Servlet内存马的本质是利用Web容器的动态注册机制,在运行时将恶意Servlet(这里只关注servlet)注入到内存中执行。它不依赖文件系统,具有很高的隐蔽性。比如上面的servLet一旦注册成功,即便删掉源文件,依然可以访问。关于反射可移步:https://www.freebuf.com/articles/web/448684.html反射原