Java代码审计基础知识「二」-java-web基础

Java代码审计基础知识「二」– java WEB基础-img

1、Java web – Servlet技术

1
2
3
4
5
6
7
8
9
JavaWeb应⽤由⼀组Servlet、HTML⻚、类【实体】、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运⾏
--
Java Web应⽤中可以包含如下内容:
Servlet
JSP ---java server page
实⽤类-------ORM(object Relational model)(对象映射模型)
静态⽂档如HTML、图⽚等
描述Web应⽤的信息(web.xml)(java web项⽬的配置⽂
件)

tomcat配置文件:

HttpServletRequest 简介(重点1)(重点都在这儿,特别是4)

1
2
3
Servlet API 中定义的 ServletRequest 接⼝类⽤于封装请求消息。
HttpServletRequest 是专⽤于HTTP协议的ServletRequest⼦接⼝,它⽤于封装 HTTP 请求消息。
service() ⽅法内部调⽤ HttpServletRequest 对象的各种⽅法来获取请求消息。

1、获取请求⾏的相关信息

1
2
3
4
5
6
7
8
9
10
11
● HTTP请求消息的请求⾏包括请求⽅式、资源路径和HTTP协议版本:
GET /lampbrother/servlet/RequestURI?param1=a&param2=b HTTP/1.1

● getMethod:返回HTTP请求消息中的请求⽅式。
● getRequestURI:返回请求⾏中的资源名部分。
● getQueryString :返回请求⾏中的参数部分。
● getProtocol:返回请求⾏中的协议名和版本。
● getContextPath:返回请求资源所属于的WEB应⽤程序的路径。
● getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
● getPathTranslated:返回URL中的额外路径信息所对应的资源的真实路径。
● getServletPath⽅法:Servlet的名称或Servlet所映射的路径。

2、获取⽹络连接信息

1
2
3
4
5
6
7
8
9
10
● getRemoteAddr⽅法返回发出请求的客户机的IP地址,其格式为“192.168.0.3”这种形式的字符⽂本。 (*)
● getRemoteHost⽅法返回发出请求的客户机的完整主机名,即“pc1.atguigu.com”这种格式。
● getRemotePort⽅法返回发出请求的客户机所使⽤的⽹络接⼝的端⼝号。
● getLocalAddr⽅法返回WEB服务器上接收当前请求的⽹络接⼝的IP地址。
● getLocalName⽅法返回WEB服务器上接收当前请求的⽹络接⼝的IP地址所对应的主机名。
● getLocalPort⽅法返回WEB服务器上接收当前请求的⽹络接⼝的端⼝号。
● getServerName⽅法返回当前请求所指向的主机名。
● getServerPort⽅法返回当前请求所连接的服务器端⼝号。
● getScheme⽅法返回请求的协议名,例如httphttpsftp
● getRequestURL⽅法返回客户端发出请求时的完整URL

3、获取请求头信息

1
2
3
4
5
6
7
8
● getHeader⽅法
● getHeaders⽅法
● getHeaderNames⽅法
● getIntHeader⽅法
● getDateHeader⽅法
● getContentType⽅法
● getContentLength⽅法
● getCharacterEncoding⽅法

4、获取请求参数(非常之重点)

1
2
3
4
● getParameter⽅法
● getParameterValues⽅法
● getParameterNames⽅法
● getParameterMap⽅法

5、请求域属性

1
2
3
4
5
6
● 存储在ServletRequest对象中的对象称之为请求域属性,属于同⼀个请求的多个处理模块之间可以通过请求域属性来传递对象数据。
● 与请求域属性相关的⽅法:
setAttribute⽅法
getAttribute⽅法
removeAttribute⽅法
getAttributeNames⽅法

HttpServletResponse简介

1
2
● Servlet API中定义的ServletResponse接⼝类⽤于创建响应消息。
● HttpServletResponse是专⽤于HTTP协议的ServletResponse⼦接⼝,它⽤于封装HTTP响应消息

2、搭建Java web环境

1
2
3
4
5
6
7
8
下载tomcat:
https://tomcat.apache.org/download-90.cgi
启动tomcat:运行:
/tomcat/bin/startup.sh
访问:http://127.0.0.1:8080/
如果能够打开 Tomcat 配置页面,则说明 Tomcat 配置成功:
关闭tomcat:运行:
/tomcat/bin/shutdown.sh

在 Tomcat 中新建 Web 工程

1
2
3
4
5
6
7
① 找到 Tomcat 目录下的 webapps 目录。 
② 在 webapps 目录下新建一个目录: first_webapp。
③ 在 first_webapp 中建立一个目录: WEB-INF。(注意大小写,WEB 和 INF 之间为横线)
④ 将上面的下载文件下载下来以后,将提供的 web.xml 文件复制到 WEB-INF 目录中。
⑤ 将提供的 index.html 文件复制到 first_webapp 目录下。
⑥ 启动 Tomcat。
⑦ 在浏览器中输入网址:http://localhose:8080/first_webapp ,查看是否能够正确访问,如果可以正确显示页面,则表示 Tomcat 中创建新项目成功。

Tomcat路由访问

1
项目运行流程:在tomcat配置文件中的conf/web.xml配置文件中配置路由,如下图:

– 在tomcat目录下创建web项目

1
2
3
4
5
6
7
随后在tomcat的目录:webapps/ROOT下新建test.jsp文件,文件内容如下:

<%@ page contentType="text/html;charset=UTF-8" %>
<%
out.print("hello world");
%>
随后访问http://127.0.0.1:8080/test.jsp

– 在项目下创建web项目

1、首先,创建一个普通的java项目。点击【file】-【new】-【project】
2、创建如下图
3、添加web部门。点击【file】-【project structure】
4、选择【modules】-选中项目“TomcatDemo”
5、点击项目名上的加号【+】,添加【web】模块
6、我们就会发现项目下多出了web模块
7、展开web包,在web包下创建一个index.jsp文件,在WEB-INF下创建classes和lib两个文件夹,如下图:
8、点击【File】-【Project structure】-【Modules】-选中项目名【TomcatDemo】-【Paths】-勾选【use module compile output path】-将output path设置为我们刚才创建的classes文件夹即可
9、点击【dependencies】-点击加号【+】-添加【JARs or directories】-选中Tomcat的lib目录
10、点击【Current File】-选择【edit configurations】
11、点击【edit configuration templates】-导入tomcat 配置如图2,点击OK
12、然后再点击左上角加号【+】添加Tomcat-local –配置如下
13、如果下面有warning提示,则点击fix,如图1,如果没有,则选择文件-项目结构-工件,然后如图2选择
14、点击确定后,然后回到 编辑配置-部署 点击+号,选择工件,点击确定
15、修改一下创建的index.jsp内容如下,并运行Tomcat

– 在项目下创建servlet项目……

1
47页,没太懂
1、创建servlet项目
2、在工程上右键,选择【Add Framework Support】(如果没有的话,按两下shift,搜索添加框架支持,(英文的搜Add Framework Support)然后双击)
3、选择web应用程序
4、在/web/WEB-INF/下创建classes和lib文件夹
5、配置Project Structure:在Modules——Path下,修改Compiler Output,选择Use module compile output path,修改两个内容框为刚才新建的classes目录,点击OK
6、导入servlet-api.jar(也就是tomcat的lib目录)
7、编写servlet测试–新建ServletDemo1类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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

@WebServlet(name = "ServletDemo1", value = "/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("GBK");
response.getWriter().println("<html><body>");
response.getWriter().println("<h1>Hello World!</h1>");
response.getWriter().println("</body></html>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

8、添加Tomcat执行

3、JSP语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<%--
Created by IntelliJ IDEA.
User: cnaq
Date: 2025/4/21
Time: 下午5:17
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>life.jsp</title>
</head>
<body>
<%!
private int initVar=0;
private int serviceVar=0;
private int destroyVar=0;
%>

<%!
public void jspInit(){
initVar++;
System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
}
public void jspDestroy(){
destroyVar++;
System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");
}
%>
<%
serviceVar++;
System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");
String content1="初始化次数 : "+initVar;
String content2="响应客户请求次数 : "+serviceVar;
String content3="销毁次数 : "+destroyVar;
%>
<h1>测试实例</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<%
out.println("Hello world!" );
%>
<p><%=content3 %></p>
</body>
</html>

3.1、 JSP⾏为

1
2
3
4
JSP⾏为标签使⽤XML语法结构来控制servlet引擎。它能够动态插⼊⼀个⽂件,重⽤JavaBean组件,引导⽤户去另⼀个⻚⾯,为Java插件产⽣相关的HTML等等。

⾏为标签只有⼀种语法格式,它严格遵守XML标准:
<jsp:action_name attribute="value" />
1
⾏为标签基本上是⼀些预先就定义好的函数,下表罗列出了⼀些可⽤的JSP⾏为标签:
标签 描述
jsp:include ⽤于在当前⻚⾯中包含静态或动态资源
jsp:useBean 寻找和初始化⼀个JavaBean组件
jsp:setProperty 设置 JavaBean组件的值
jsp:getProperty 将 JavaBean组件的值插⼊到output中
jsp:forward 从⼀个JSP⽂件向另⼀个⽂件传递⼀个包含⽤户请求的request对象
jsp:plugin ⽤于在⽣成的HTML⻚⾯中包含Applet和JavaBean对象
jsp:element 动态创建⼀个XML元素
jsp:attribute 定义动态创建的XML元素的属性
jsp:body 定义动态创建的XML元素的主体
jsp:text ⽤于封装模板数据

3.2、JSP指令

1
2
3
P指令⽤来设置整个JSP⻚⾯相关的属性,如⽹⻚的编码⽅式和脚本语⾔。
语法格式如下:
<%@ directive attribute="value" %>
1
指令可以有很多个属性,它们以键值对的形式存在,并⽤逗号隔开。
1
JSP中的三种指令标签:
指令 描述
<%@ page … %> 定义⽹⻚依赖属性,⽐如脚本语⾔、error⻚⾯、缓存需求等等
<%@ include … %> 包含其他⽂件
<%@ taglib … %> 引⼊标签库的定义

3.2.1、Page指令

1
2
3
4
5
Page指令为容器提供当前⻚⾯的使⽤说明。⼀个JSP⻚⾯可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute="value" %>
等价的XML格式:
<jsp:directive.page attribute="value" />

下表列出与Page指令相关的属性:

属性 描述
buffer 指定out对象使⽤缓冲区的⼤⼩
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP⻚⾯的MIME类型和字符编码
errorPage 指定当JSP⻚⾯发⽣异常时需要转向的错误处理⻚⾯
isErrorPage 指定当前⻚⾯是否可以作为另⼀个JSP⻚⾯的错误处理⻚⾯
extends 指定servlet从哪⼀个类继承
import 导⼊要使⽤的Java类
info 定义JSP⻚⾯的描述信息
isThreadSafe 指定对JSP⻚⾯的访问是否为线程安全
language 定义JSP⻚⾯所⽤的脚本语⾔,默认是Java
session 指定JSP⻚⾯是否使⽤session
isELIgnored 指定是否执⾏EL表达式
isScriptingEnabled 确定脚本元素能否被使⽤

3.2.2、Include指令

1
2
3
JSP可以通过include指令来包含其他⽂件。被包含的⽂件可以是JSP⽂件、HTML⽂件或⽂本⽂件。包含的⽂件就好像是该JSP⽂件的⼀部分,会被同时编译执⾏。
Include指令的语法格式如下:
<%@ include file="⽂件相对 url 地址" %>
1
2
3
4
include 指令中的⽂件名实际上是⼀个相对的 URL 地址。
如果您没有给⽂件关联⼀个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
<jsp:directive.include file="⽂件相对 url 地址" />

3.2.3、Taglib指令

1
2
JSP API允许⽤户⾃定义标签,⼀个⾃定义标签库就是⾃定义标签的集合。
Taglib指令引⼊⼀个⾃定义标签集合的定义,包括库路径、⾃定义标签。
1
2
3
4
5
6
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

3.3、隐式对象

1
JSP隐式对象是JSP容器为每个⻚⾯提供的Java对象,开发者可以直接使⽤它们⽽不⽤显式声明。JSP隐式对象也被称为预定义变量。

JSP所⽀持的九⼤隐式对象:

对象 描述
request HttpServletRequest接口的实例
response HttpServletRespose接口的实例
out JspWriter类的实例,用于把结果输出到网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP⻚⾯所有对象以及命名空间的访问
page 类似于Java类中的this关键字
Exception Exception类的对象,代表发⽣错误的JSP⻚⾯中对应的异常对象

3.4、常⽤的获取HTTP信息头的⽅法

序号 方法&描述
1 Cookie[] getCookies()返回客户端所有的Cookie的数组
2 Enumeration getAttributeNames()返request对象的所有属性名称的集合
3 Enumeration getHeaderNames()返回所有HTTP头的名称集合
4 Enumeration getParameterNames()返回请求中所有参数的集合
5 HttpSession getSession()返回request对应的session对象,如果没有,则创建⼀个
6 HttpSession getSession(boolean create)返回request对应的session对象,如果没有并且参数create为true,则返回⼀个新的session对象
7 Locale getLocale()返回当前⻚的Locale对象,可以在response中设置
8 Object getAttribute(String name)返回名称为name的属性值,如果不存在则返回null。
9 ServletInputStream getInputStream()返回请求的输⼊流
10 String getAuthType()返回认证⽅案的名称,⽤来保护servlet,⽐如 “BASIC” 或者”SSL” 或 null 如果 JSP没设置保护措施
11 String getCharacterEncoding()返回request的字符编码集名称
12 String getContentType()返回request主体的MIME类型,若未知则返回null
13 String getContextPath()返回request URI中指明的上下⽂路径
14 String getHeader(String name)返回name指定的信息头
15 String getMethod()返回此request中的HTTP⽅法,⽐如GET,,POST,或PUT
16 String getParameter(String name)返回此request中name指定的参数,若不存在则返回null
17 String getPathInfo()返回任何额外的与此request URL相关的路径
18 String getProtocol()返回此request所使⽤的协议名和版本
19 String getQueryString()返回此 request URL包含的查询字符串
20 String getRemoteAddr()返回客户端的IP地址
21 String getRemoteHost()返回客户端的完整名称
22 String getRemoteUser()返回客户端通过登录认证的⽤户,若⽤户未认证则返回null
23 String getRequestURI()返回request的URI
24 String getRequestedSessionId()返回request指定的session ID
25 String getServletPath()返回所请求的servlet路径
26 String[] getParameterValues(String name)返回指定名称的参数的所有值,若不存在则返回null
27 boolean isSecure()返回request是否使⽤了加密通道,⽐如HTTPS
28 int getContentLength()返回request主体所包含的字节数,若未知的返回-1
29 int getIntHeader(String name)返回指定名称的request信息头的值
30 int getServerPort()返回服务器端⼝号

3.5、 HttpServletResponse类

序号 方法&描述
1 String encodeRedirectURL(String url)对sendRedirect()⽅法使⽤的URL进⾏编码
2 String encodeURL(String url)将URL编码,回传包含Session ID的URL
3 boolean containsHeader(String name)返回指定的响应头是否存在
4 boolean isCommitted()返回响应是否已经提交到客户端
5 void addCookie(Cookie cookie)添加指定的cookie⾄响应中
6 void addDateHeader(String name, long date)添加指定名称的响应头和⽇期值
7 void addHeader(String name, String value)添加指定名称的响应头和值
8 void addIntHeader(String name, int value)添加指定名称的响应头和int值
9 void flushBuffer()将任何缓存中的内容写⼊客户端
10 void reset()清除任何缓存中的任何数据,包括状态码和各种响应头
11 void resetBuffer()清除基本的缓存数据,不包括响应头和状态码
12 void sendError(int sc)使⽤指定的状态码向客户端发送⼀个出错响应,然后清除缓存
13 void sendError(int sc, String msg)使⽤指定的状态码和消息向客户端发送⼀个出错响应
14 void sendRedirect(String location)使⽤指定的URL向客户端发送⼀个临时的间接响应
15 void setBufferSize(int size)设置响应体的缓存区⼤⼩
16 void setCharacterEncoding(String charset)指定响应的编码集(MIME字符集),例如UTF-8
17 void setContentLength(int len)指定HTTP servlets中响应的内容的⻓度,此⽅法⽤来设置 HTTP Content-Length 信息头
18 void setContentType(String type)设置响应的内容的类型,如果响应还未被提交的话
19 void setDateHeader(String name, long date)使⽤指定名称和⽇期设置响应头的名称和⽇期
20 void setHeader(String name, String value)使⽤指定名称和值设置响应头的名称和内容
21 void setIntHeader(String name, int value)指定 int 类型的值到 name 标头
22 void setLocale(Locale loc)设置响应的语⾔环境,如果响应尚未被提交的话

4、MVC介绍

1
2
3
4
5
6
7
MVC是Model-View-Controller的简称,即模型-视图-控制器。是⼀种设计模式,它把应⽤程序分成三个核⼼模块:模型、视图、控制器,它们各⾃处理⾃⼰的任务。

模型是应⽤程序的主体部分,模型表示业务数据和业务逻辑。⼀个模型能为多个视图提供数据,由于应⽤于模型的代码只需写⼀次就可以被多个视图重⽤,所以提⾼了代码的可重⽤性。

视图是⽤户看到并与之交互的界⾯,视图向⽤户显示相关的数据、接受⽤户的输⼊、不进⾏任何实际的业务处理。

控制器接受⽤户的输⼊并调⽤模型和视图去完成⽤户的需求。控制器接收请求并决定调⽤哪个模型组件去处理请求,然后决定调⽤哪个视图来显示模型处理返回的数据

5、过滤器Filter介绍

1
可修复未授权、越权等。
1
2
3
4
·Filter 的基本功能是对 Servlet 容器调⽤ Servlet 的过程进⾏拦截,从⽽在 Servlet 进⾏响应处理的前后实现⼀些特殊的功能。
·在 Servlet API 中定义了三个接⼝类来供开发⼈员编写Filter 程序:Filter, FilterChain, FilterConfig
·Filter 程序是⼀个实现了 Filter 接⼝的 Java 类,与 Servlet 程序相似,它由 Servlet 容器进⾏调⽤和执⾏
·Filter 程序需要在 web.xml ⽂件中进⾏注册和设置它所能拦截的资源:Filter 程序可以拦截 Jsp, Servlet, 不拦截静态图⽚⽂件和静态 html ⽂件

5.1、filter接口

public voic init(FilterConfig filterConfig) throws ServletException

1
2
1、在 Web 应⽤程序启动时,Web 服务器(Web 容器)将根据其 web.xml ⽂件的配置信息来创建每个注册的 Filter 的实例对象,并将其保存在内存中。
2、Web 容器创建 Filter 的实例对象后,将⽴即调⽤该Filter 对象的 init ⽅法。init ⽅法在 Filter ⽣命周期中仅被执⾏⼀次,Web 容器在调⽤ init ⽅法时,会传递⼀个包含Filter 的配置和运⾏环境信息的 FilterConfig 对象。

doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws java.io.IOException,ServletException:

1
参数 request 和 response 为 Web 容器或 Filter 链中上⼀个 Filter 传递过来的请求和响应对象;参数 chain 为代表当前 Filter 链的对象。

destroy⽅法

1
该⽅法在 Web 容器卸载 Filter 对象之前被调⽤,也仅执⾏⼀次。可以完成与 init ⽅法相反的功能,释放被该 Filter 对象打开的资源,例如:关闭数据库连接和 IO 流。

5.2、FilterConfig 接⼝

1
2
3
4
5
6
7
8
9
javax.servlet.FilterConfig接⼝:该接⼝类似于ServletConfig接⼝,由容器实现。Servlet规范将代表ServletContext 对象和 Filter 的配置参数信息都封装在该对象中。Servlet 容器将其作为参数传⼊过滤器对象的init()⽅法中。

String getFilterName():得到描述符中指定的过滤器的名字。

String getInitParameter(String name): 返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null.

Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

public ServletContext getServletContext():返回Servlet上下⽂对象的引⽤。

5.3、FilterChain接⼝

1
2
3
FilterChain接⼝:代表当前 Filter 链的对象。由容器实现,容器将其实例作为参数传⼊过滤器对象的doFilter()⽅法中。过滤器对象使⽤FilterChain对象调⽤过滤器链中的下⼀个过滤器,如果该过滤器是链中昀后⼀个过滤器,那么将调⽤⽬标资源。

doFilter(ServletRequest request,ServletResponse response)throws java.io.IOException:调⽤该⽅法将使过滤器链中的下⼀个过滤器被调⽤。如果是昀后⼀个过滤器,会调⽤⽬标资源。

Java代码审计基础知识「二」-java-web基础
http://aqiao-jashell.github.io/2025/08/15/Java代码审计基础知识「二」-java-web基础/
作者
CNAQ
发布于
2025年8月15日
许可协议