Servlet
Servlet
定义在jakarta.servlet
包中,定义了Servlet的生命周期方法以及获取Servlet配置信息和元数据的方法。Servlet是在Web服务器上运行的Java程序,用于接收和处理来自Web客户端的请求。
主要方法
init(ServletConfig config)
- 这个方法由Servlet容器调用,以指示Servlet正在被部署到服务中。
ServletConfig
对象包含了Servlet的配置和初始化参数。- Servlet容器在实例化Servlet后仅调用一次
init
方法。该方法必须成功完成,Servlet才能接收请求。 - 如果
init
方法抛出ServletException
或者没有在服务器定义的时间内返回,则Servlet容器无法部署该Servlet。
getServletConfig()
- 返回一个
ServletConfig
对象,该对象包含初始化和启动参数。 - 返回的
ServletConfig
对象是传递给init
方法的对象。
service(ServletRequest req, ServletResponse res)
- 由Servlet容器调用,允许Servlet响应请求。
- 这个方法在
init
方法成功完成后才会被调用。 - 开发者需要注意,Servlet通常运行在支持多线程的容器中,因此需要同步对共享资源的访问。
- 如果Servlet抛出或发送错误,应该设置响应的状态码。
getServletInfo()
- 返回关于Servlet的信息,如作者、版本和版权。
- 返回的字符串应该是纯文本,不应包含任何标记语言。
destroy()
- 由Servlet容器调用,指示Servlet正在被移除服务。
- 这个方法在Servlet的所有线程退出
service
方法或超时后调用。 - 给Servlet一个机会来清理持有的资源,并确保任何持久状态与内存中的当前状态同步。
生命周期
Servlet的生命周期包括以下几个阶段:
- 构造:Servlet类被实例化。
- 初始化:通过调用
init
方法进行初始化。 - 请求服务:通过调用
service
方法来处理客户端请求。 - 销毁:通过调用
destroy
方法来结束服务,之后Servlet实例会被垃圾回收。
ServletConfig
ServletConfig
接口为Servlet提供了配置信息,这些信息通常在Servlet初始化时由Servlet容器提供,这包括Servlet的名称、初始化参数以及它所在的ServletContext。
主要方法
getServletName()
- 返回当前Servlet实例的名称。
- 这个名称可能由服务器管理提供,或在Web应用程序的部署描述符中分配。
- 对于未注册(因此未命名)的Servlet实例,其名称将是Servlet的类名。
getServletContext()
- 返回当前Servlet执行的
ServletContext
对象的引用。 ServletContext
对象用于Servlet与它的容器进行交互,可以获取容器的信息,如初始化参数、资源等。
getInitParameter(String name)
- 返回指定名称的初始化参数的值,如果参数不存在则返回
null
。 - 初始化参数通常在部署描述符(如web.xml)中设置,或者通过服务器管理界面配置。
getInitParameterNames()
- 返回Servlet的所有初始化参数名称的枚举。
- 如果Servlet没有初始化参数,则返回一个空的枚举。
使用场景
- 当Servlet初始化时,它可以通过
ServletConfig
对象获取其配置信息。 - 通过
getInitParameter
方法,Servlet可以读取特定的初始化参数,这些参数可以在部署描述符中设置。 - 通过
getServletContext
方法,Servlet可以访问其容器的上下文信息,例如获取容器的路径、设置属性等。
GenericServlet
GenericServlet
是一个抽象类,实现了 Servlet
和 ServletConfig
接口。这个类提供了一个通用的、协议无关的Servlet实现,是编写Servlet时的一个基础类。
查看源码
/**
* 定义一个通用、协议无关的servlet。若要编写用于Web的HTTP servlet,请扩展
* jakarta.servlet.http.HttpServlet。
* GenericServlet 实现了 Servlet 和 ServletConfig 接口。
* 可以直接通过 GenericServlet 扩展一个servlet,尽管更常见的是扩展一个
* 特定协议的子类,如 HttpServlet。
* GenericServlet 使得编写servlet更加容易。它提供了简单版本的声明周期方法
* init 和 destroy,以及 ServletConfig 接口中的方法。
* GenericServlet 还实现了在 ServletContext 接口中声明的 log 方法。
* 要编写一个通用servlet,只需覆盖抽象的 service 方法。
*/
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
/**
* 默认构造函数,不做任何事情。所有的servlet初始化都由 init 方法之一完成。
*/
public GenericServlet() {
// 默认无操作
}
/**
* 由servlet容器调用,通知servlet该servlet正在被移出服务。
*/
@Override
public void destroy() {
// 默认无操作
}
/**
* 返回包含指定初始化参数值的字符串,如果参数不存在则返回 null。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取指定参数的值。
*/
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
/**
* 返回servlet的初始化参数名称作为字符串对象的枚举,如果没有初始化参数则返回空的枚举。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取参数名称。
*/
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
/**
* 返回此servlet的 ServletConfig 对象。
*/
@Override
public ServletConfig getServletConfig() {
return config;
}
/**
* 返回servlet运行的 ServletContext 的引用。
* 此方法提供方便。它从servlet的 ServletConfig 对象获取上下文。
*/
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
/**
* 返回有关servlet的信息,如作者、版本和版权。默认情况下,此方法返回空字符串。覆盖此方法以使其返回有意义的价值。
*/
@Override
public String getServletInfo() {
return "";
}
/**
* 由servlet容器调用,通知servlet该servlet正在被放入服务。
* 此实现存储从servlet容器接收的 ServletConfig 对象以备后用。
* 当覆盖此形式的方法时,调用 super.init(config)。
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
/**
* 一个方便的方法,可以被覆盖,这样就无需调用 super.init(config)。
* 不再覆盖 init(ServletConfig),只需覆盖此方法,它将由
* GenericServlet.init(ServletConfig config) 调用。仍然可以通过
* getServletConfig 获取 ServletConfig 对象。
*/
public void init() throws ServletException {
// 默认无操作
}
/**
* 将指定的消息写入servlet日志文件,前面加上servlet
的名称。
*/
public void log(String message) {
getServletContext().log(getServletName() + ": " + message);
}
/**
* 为给定的 Throwable 异常写入解释性消息和堆栈跟踪到servlet日志文件,前面加上servlet的名称。
*/
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
/**
* 由servlet容器调用,允许servlet响应请求。
* 此方法被声明为抽象,因此子类,如 HttpServlet,必须覆盖它。
*/
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
/**
* 返回此servlet实例的名称。
*/
@Override
public String getServletName() {
return config.getServletName();
}
}
类的目的
GenericServlet
的目的是为了简化Servlet的编写过程。它提供了 Servlet
和 ServletConfig
接口中方法的简单实现,允许开发者专注于实现 service
方法,这是处理客户端请求的核心方法。
主要方法
构造方法 GenericServlet()
- 默认构造方法,不执行任何操作。
destroy()
- 默认实现不执行任何操作,子类可以覆盖此方法以执行清理操作。
getInitParameter(String name)
- 返回指定名称的初始化参数值,通过委托给
ServletConfig
对象实现。
getInitParameterNames()
- 返回所有初始化参数名称的枚举,通过委托给
ServletConfig
对象实现。
getServletConfig()
- 返回
ServletConfig
对象,该对象在init
方法中被设置。
getServletContext()
- 返回
ServletContext
对象,通过ServletConfig
对象获取。
getServletInfo()
- 返回关于Servlet的信息,默认实现返回空字符串,子类可以覆盖以提供更多信息。
init(ServletConfig config)
- 保存
ServletConfig
对象,并调用没有参数的init()
方法。
init()
- 没有参数的初始化方法,子类可以覆盖此方法以执行初始化逻辑。
log(String message)
- 记录日志消息,前缀是Servlet的名称。
log(String message, Throwable t)
- 记录日志消息和一个异常的堆栈跟踪,前缀是Servlet的名称。
service(ServletRequest req, ServletResponse res)
- 抽象方法,必须由子类实现以处理客户端请求。
getServletName()
- 返回Servlet的名称,通过
ServletConfig
对象获取。
ServletContext
ServletContext
为 Servlet 提供了一个全局的、应用级别的上下文环境。它不仅是 Web 应用中不同组件之间共享数据和资源的桥梁,还是管理和配置 Web 应用行为的重要工具。通过 ServletContext
,开发者可以更灵活地控制 Web 应用的各个方面,包括资源访问、会话管理、日志记录和组件注册等。
常量
TEMPDIR
: 这个字符串常量用来获取或设置 ServletContext 的临时目录路径,通常用于文件上传等操作。ORDERED_LIBS
: 这个字符串常量用于获取或设置 ServletContext 的有序库路径。
方法
上下文路径和服务器信息
getContextPath()
: 返回与此 ServletContext 关联的路径,这是 Web 应用的根路径。getContext(String uri)
: 获取指定路径的 ServletContext 对象,用于访问同一服务器上的其他 Web 应用。getMajorVersion()
: 返回 Servlet API 的主版本号。getMinorVersion()
: 返回 Servlet API 的次版本号。getEffectiveMajorVersion()
: 返回当前 Web 应用实际使用的 Servlet API 的主版本号。getEffectiveMinorVersion()
: 返回当前 Web 应用实际使用的 Servlet API 的次版本号。getServerInfo()
: 返回服务器名和版本。
资源处理
getMimeType(String file)
: 根据文件名确定 MIME 类型。getResourcePaths(String path)
: 返回指定路径下所有资源的路径集合。getResource(String path)
: 返回指定路径的资源作为 URL 对象。getResourceAsStream(String path)
: 返回指定路径的资源作为 InputStream。
请求分发
getRequestDispatcher(String path)
: 返回一个用于将请求转发到另一个资源或者包含另一个资源的 RequestDispatcher。getNamedDispatcher(String name)
: 返回指定名称的 Servlet 的 RequestDispatcher。
日志记录
log(String msg)
: 记录一条信息级别的日志消息。log(String msg, Throwable t)
: 记录一条带有异常堆栈的错误级别的日志消息。
初始化参数和属性
getInitParameter(String name)
: 获取 Web 应用的初始化参数。getInitParameterNames()
: 获取所有初始化参数的名称。setAttribute(String name, Object object)
: 在 ServletContext 中设置属性。getAttribute(String name)
: 获取 ServletContext 中的属性。getAttributeNames()
: 获取所有属性的名称。removeAttribute(String name)
: 删除 ServletContext 中的属性。
Servlet、Filter 和 Listener 的注册
addServlet
,addFilter
,addListener
: 分别用于动态注册 Servlet、Filter 和 EventListener。createServlet
,createFilter
,createListener
: 用于实例化 Servlet、Filter 和 EventListener。getServletRegistration
,getFilterRegistration
: 获取已注册的 Servlet 和 Filter 的信息。
会话管理
getSessionCookieConfig()
: 获取会话跟踪的 Cookie 配置。setSessionTrackingModes(Set<SessionTrackingMode> modes)
: 设置会话跟踪模式。getDefaultSessionTrackingModes()
: 获取默认的会话跟踪模式。getEffectiveSessionTrackingModes()
: 获取有效的会话跟踪模式。getSessionTimeout()
: 获取会话超时时间(分钟)。setSessionTimeout(int sessionTimeout)
: 设置会话超时时间(分钟)。
编码设置
getRequestCharacterEncoding()
: 获取请求的字符编码。setRequestCharacterEncoding(String encoding)
: 设置请求的字符编码。getResponseCharacterEncoding()
: 获取响应的字符编码。setResponseCharacterEncoding(String encoding)
: 设置响应的字符编码。
其他
getRealPath(String path)
: 获取对应于 Web 应用中的虚拟路径的实际磁盘路径。getServletContextName()
: 获取 Web 应用的名称。declareRoles(String... roles)
: 声明安全角色。getVirtualServerName()
: 获取虚拟服务器的名称。getClassLoader()
: 获取用于加载 Web 应用类和资源的 ClassLoader。
ServletContext
接口为 Servlet 提供了与 Web 容器通信的桥梁,它包含了大量的方法来管理应用的生命周期、资源、会话和日志等。通过这个接口,开发者能够更加灵活地控制 Servlet 容器的行为。
HttpServlet
public abstract class HttpServlet extends GenericServlet
这意味着 HttpServlet
是一个抽象类,它继承了 GenericServlet
类,后者实现了 Servlet
和 ServletConfig
接口。
HttpServlet
是专门为处理 HTTP 请求而设计的,它不能直接实例化,只是提供了一个框架,必须通过子类来实现具体的 HTTP 方法处理逻辑。
常量
serialVersionUID
: 这是一个静态字段,用于序列化版本控制。HttpServlet
的序列化版本标识符被设置为 1L。- HTTP 方法常量:
METHOD_DELETE
: 表示 HTTP DELETE 方法。METHOD_HEAD
: 表示 HTTP HEAD 方法。METHOD_GET
: 表示 HTTP GET 方法。METHOD_OPTIONS
: 表示 HTTP OPTIONS 方法。METHOD_POST
: 表示 HTTP POST 方法。METHOD_PUT
: 表示 HTTP PUT 方法。METHOD_TRACE
: 表示 HTTP TRACE 方法。
- HTTP 头信息常量:
HEADER_IFMODSINCE
: 表示 HTTP 请求头中的 “If-Modified-Since” 字段。HEADER_LASTMOD
: 表示 HTTP 响应头中的 “Last-Modified” 字段。
- 本地化字符串资源文件名和资源包:
LSTRING_FILE
: 本地化字符串资源的文件名。lStrings
: 一个ResourceBundle
对象,用于获取本地化的字符串。
- 敏感 HTTP 头信息列表:
SENSITIVE_HTTP_HEADERS
: 一个列表,包含了在日志记录中可能被认为是敏感的 HTTP 头信息。
- 遗留的
doHead
方法标记:LEGACY_DO_HEAD
: 一个标记,用于指示是否使用遗留的doHead
方法处理HEAD
请求。这个标记自 Servlet 6.0 起被废弃,用于兼容早期版本的 Servlet API。
字段
同步锁和缓存字段:
cachedAllowHeaderValueLock
: 用于同步访问cachedAllowHeaderValue
字段的锁对象。cachedAllowHeaderValue
: 缓存的Allow
响应头的值,用于告诉客户端哪些 HTTP 方法是被支持的。cachedUseLegacyDoHead
: 布尔值,用于指示是否使用遗留的doHead
方法。
内部类
在 HttpServlet
类中,定义了几个内部类,这些类用于扩展 HttpServletResponse
和 ServletOutputStream
,以支持一些特殊的行为,特别是与 HTTP HEAD 请求的处理相关。
NoBodyResponse
这是一个扩展了 HttpServletResponseWrapper
的内部类,用于在处理 HTTP HEAD 请求时,不实际写入响应体。这个类的主要特点包括:
noBodyOutputStream
: 一个特殊的ServletOutputStream
,用于记录写入的字节数,但不实际写入响应体。originalOutputStream
: 保存原始的ServletOutputStream
,以便在需要时恢复原始行为。noBodyWriter
: 一个特殊的PrintWriter
,用于在 HEAD 请求中写入响应头信息。didSetContentLength
: 一个布尔值,用于标记是否已经设置了Content-Length
头。
NoBodyAsyncContextListener
这是一个实现了 AsyncListener
接口的内部类,用于处理 HTTP HEAD 请求的异步事件。当 HEAD 请求完成时,它会调用 setContentLength
方法,以确保 Content-Length
头被正确设置。
TomcatHack
这是一个静态内部类,用于检测和处理特定的 Tomcat 请求对象。它包含了一个静态方法 getAllowTrace
,用于检查请求是否允许 TRACE 方法。
NoBodyPrintWriter
这是一个扩展了 PrintWriter
的内部类,用于在 HEAD 请求中写入响应头信息。它使用一个特殊的 NoBodyOutputStream
来记录写入的字节数,但不实际写入响应体。
NoBodyOutputStream
这是一个扩展了 ServletOutputStream
的内部类,用于在 HEAD 请求中记录写入的字节数,但不实际写入响应体。它使用一个静态字段 writtenByteCount
来跟踪写入的字节数,并在必要时调用 checkCommit
方法来确保 Content-Length
头被正确设置。
这些内部类的主要目的是在处理 HTTP HEAD 请求时,确保响应体不被实际写入,同时正确地设置 Content-Length
头。这对于优化性能和响应缓存非常有用,因为服务器可以提前知道响应体的长度,并据此做出相应的缓存决策。
方法
HttpServlet
是一个抽象类,它扩展了 GenericServlet
,用于处理 HTTP 请求。
构造函数
public HttpServlet()
: 默认构造函数,没有参数。
初始化方法
public void init(ServletConfig config) throws ServletException
: 该方法在 Servlet 实例化后被调用,用于初始化 Servlet。它读取了一个初始化参数来决定是否使用遗留的doHead
方法处理HEAD
请求。
HTTP 方法处理
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP GET 请求。如果 GET 请求不被支持,它会调用sendMethodNotAllowed
方法发送 405 错误。protected long getLastModified(HttpServletRequest req)
: 返回资源的最后修改时间,用于缓存控制。默认实现返回 -1L,表示不支持缓存。protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP HEAD 请求。如果启用了遗留模式,它会使用NoBodyResponse
来避免发送响应体。protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP POST 请求。如果 POST 请求不被支持,它会调用sendMethodNotAllowed
方法发送 405 错误。protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP PUT 请求。如果 PUT 请求不被支持,它会调用sendMethodNotAllowed
方法发送 405 错误。protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP DELETE 请求。如果 DELETE 请求不被支持,它会调用sendMethodNotAllowed
方法发送 405 错误。protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP OPTIONS 请求。它会设置Allow
响应头,列出支持的 HTTP 方法。protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 抽象方法,用于处理 HTTP TRACE 请求。它会返回一个包含请求头信息的响应。
这些方法都是受保护的,子类可以覆盖它们以实现特定的请求处理逻辑。
服务方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
: 根据请求的 HTTP 方法类型调用相应的方法来处理请求。它是 HttpServlet
类的核心,负责将请求分发给正确的处理方法。
查看代码
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
: 重写 GenericServlet
的 service
方法,确保传入的是 HttpServletRequest
和 HttpServletResponse
对象,然后调用 service(HttpServletRequest, HttpServletResponse)
。
查看代码
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException(lStrings.getString("http.non_http"));
}
this.service(request, response);
}
辅助方法
private void sendMethodNotAllowed(HttpServletRequest req, HttpServletResponse resp, String msg) throws IOException
: 发送一个错误响应,表明请求的方法不被允许。private String getCachedAllowHeaderValue()
: 生成一个字符串,列出了所有支持的 HTTP 方法,用于Allow
响应头。private static Method[] getAllDeclaredMethods(Class<?> c)
: 递归地获取类及其超类中声明的所有方法。private boolean isSensitiveHeader(String headerName)
: 检查指定的 HTTP 头是否是敏感的。
缓存和安全性
private boolean cachedUseLegacyDoHead
: 布尔值,指示是否使用遗留的doHead
方法。private static final List<String> SENSITIVE_HTTP_HEADERS
: 包含了在日志记录中可能被认为是敏感的 HTTP 头信息的列表。
HttpServletRequest
这个类是一个接口,名为 HttpServletRequest
,它位于 jakarta.servlet.http
包中。这个接口扩展了 ServletRequest
接口,并为 HTTP Servlet 提供了额外的请求信息和方法。
常量
BASIC_AUTH
、FORM_AUTH
、CLIENT_CERT_AUTH
、DIGEST_AUTH
:这些是认证方式的字符串常量,分别代表基本认证、表单认证、客户端证书认证和摘要认证。
方法
getAuthType()
: 返回这次请求的认证类型,如 "BASIC"、"FORM" 等。getCookies()
: 返回一个数组,包含客户端随这次请求发送的 Cookie。getDateHeader(String name)
: 以毫秒为单位返回指定的请求头字段的值,转换为自1970年1月1日00:00:00 GMT以来的日期。getHeader(String name)
: 返回指定请求头的值。getHeaders(String name)
: 返回一个枚举,包含所有与指定名称对应的请求头值。getHeaderNames()
: 返回一个枚举,包含请求中所有头的名称。getIntHeader(String name)
: 以整数形式返回指定请求头的值。getHttpServletMapping()
: 默认方法,返回一个HttpServletMapping
对象,它提供了关于如何将请求映射到servlet的信息。getMethod()
: 返回请求的 HTTP 方法,如 "GET"、"POST" 等。getPathInfo()
: 返回任何额外的路径信息,以/
开始,跟在 servlet 路径之后。getPathTranslated()
: 将getPathInfo()
返回的路径信息转换为真实路径。newPushBuilder()
: 默认方法,返回一个PushBuilder
实例,用于推送资源。getContextPath()
: 返回请求的上下文路径。getQueryString()
: 返回请求 URL 中的查询字符串。getRemoteUser()
: 返回经过身份验证的远程用户。isUserInRole(String role)
: 检查经过身份验证的用户是否属于指定的角色。getUserPrincipal()
: 返回一个Principal
对象,包含经过身份验证的用户的用户名。getRequestedSessionId()
: 返回请求的 session ID。getRequestURI()
: 返回请求的 URI。getRequestURL()
: 返回请求的完整 URL。getServletPath()
: 返回请求的 servlet 路径。getSession(boolean create)
: 返回当前请求的HttpSession
,如果create
为true
且没有当前会话,则创建一个。getSession()
: 等同于getSession(true)
。changeSessionId()
: 更改当前会话的 ID。isRequestedSessionIdValid()
: 检查请求的 session ID 是否有效。isRequestedSessionIdFromCookie()
: 检查请求的 session ID 是否来自 cookie。isRequestedSessionIdFromURL()
: 检查请求的 session ID 是否来自 URL。authenticate(HttpServletResponse response)
: 用于启动一个认证过程。login(String username, String password)
: 用于登录用户。logout()
: 用于注销用户。getParts()
: 返回一个集合,包含请求中的所有Part
对象。getPart(String name)
: 返回请求中指定名称的Part
对象。upgrade(Class<T> handlerClass)
: 用于升级协议,并返回一个升级处理器的实例。getTrailerFields()
: 默认方法,返回一个不可修改的映射,包含请求的尾部字段。isTrailerFieldsReady()
: 默认方法,检查是否可以安全地读取尾部字段。
HttpServletResponse
这个类是一个接口,名为 HttpServletResponse
,它位于 jakarta.servlet.http
包中。这个接口扩展了 ServletResponse
接口,并为 HTTP Servlet 提供了额外的响应信息和方法。
常量
HttpServletResponse
接口中定义了 HTTP 状态码。它们代表了服务器在 HTTP 响应中发送给客户端的各种状态信息。
1xx: Informational - 通知性状态码
SC_CONTINUE
: 100,表示客户端应当继续发送请求。这个临时响应是用来通知客户端的,它的请求已经收到了一部分,而且没有被服务器拒绝。SC_SWITCHING_PROTOCOLS
: 101,表示服务器正在根据客户端的请求切换协议。
2xx: Success - 成功状态码
SC_OK
: 200,表示请求已成功被服务器处理。SC_CREATED
: 201,表示请求已经被成功处理,并且创建了一个新的资源。SC_ACCEPTED
: 202,表示请求已经被接受处理,但是处理尚未完成。SC_NON_AUTHORITATIVE_INFORMATION
: 203,表示服务器是一个转换代理服务器,它返回的内容可能来自另一个源。SC_NO_CONTENT
: 204,表示服务器成功处理了请求,但没有返回任何内容。SC_RESET_CONTENT
: 205,表示服务器成功处理了请求,并要求客户端重置文档视图。SC_PARTIAL_CONTENT
: 206,表示服务器成功处理了部分 GET 请求。
3xx: Redirection - 重定向状态码
SC_MULTIPLE_CHOICES
: 300,表示针对请求,服务器可执行多种操作。服务器会提供一个选项列表,用户可以选择其中一个操作。SC_MOVED_PERMANENTLY
: 301,表示请求的资源已被永久移动到新位置。SC_MOVED_TEMPORARILY
: 302,已过时,被SC_FOUND
取代。SC_FOUND
: 302,表示请求的资源被临时移动到了另一个位置。SC_SEE_OTHER
: 303,表示服务器发送了一个 GET 请求的 URI,客户端应使用 GET 方法访问该 URI。SC_NOT_MODIFIED
: 304,表示资源未被修改,客户端可以使用缓存的资源。SC_USE_PROXY
: 305,已过时,不再使用。SC_TEMPORARY_REDIRECT
: 307,表示请求的资源被临时移动到了另一个位置。
4xx: Client Error - 客户端错误状态码
SC_BAD_REQUEST
: 400,表示请求格式错误,服务器无法理解。SC_UNAUTHORIZED
: 401,表示请求需要用户身份验证。SC_PAYMENT_REQUIRED
: 402,保留给将来使用。SC_FORBIDDEN
: 403,表示服务器理解请求,但拒绝执行。SC_NOT_FOUND
: 404,表示请求的资源在服务器上不存在。SC_METHOD_NOT_ALLOWED
: 405,表示请求的 HTTP 方法不被允许。SC_NOT_ACCEPTABLE
: 406,表示服务器无法生成符合客户端要求的响应。SC_PROXY_AUTHENTICATION_REQUIRED
: 407,表示客户端必须首先使用代理服务器进行身份验证。SC_REQUEST_TIMEOUT
: 408,表示客户端请求超时。SC_CONFLICT
: 409,表示请求因为冲突而无法完成。SC_GONE
: 410,表示请求的资源不再可用。SC_LENGTH_REQUIRED
: 411,表示服务器拒绝处理没有定义Content-Length
的请求。SC_PRECONDITION_FAILED
: 412,表示请求的先决条件失败。SC_REQUEST_ENTITY_TOO_LARGE
: 413,表示请求实体过大,服务器拒绝处理。SC_REQUEST_URI_TOO_LONG
: 414,表示请求的 URI 过长,服务器拒绝处理。SC_UNSUPPORTED_MEDIA_TYPE
: 415,表示请求的媒体类型不受支持。SC_REQUESTED_RANGE_NOT_SATISFIABLE
: 416,表示请求的范围无效或无法满足。SC_EXPECTATION_FAILED
: 417,表示服务器无法满足期望请求头字段。
5xx: Server Error - 服务器错误状态码
SC_INTERNAL_SERVER_ERROR
: 500,表示服务器遇到了一个意外的情况,阻止它完成请求。SC_NOT_IMPLEMENTED
: 501,表示服务器不支持请求的功能。SC_BAD_GATEWAY
: 502,表示服务器作为网关或代理,从上游服务器收到了无效的响应。SC_SERVICE_UNAVAILABLE
: 503,表示服务器暂时无法处理请求。SC_GATEWAY_TIMEOUT
: 504,表示服务器作为网关或代理,没有及时从上游服务器收到响应。SC_HTTP_VERSION_NOT_SUPPORTED
: 505,表示服务器不支持请求的 HTTP 版本。
这些状态码用于 HttpServletResponse
接口的方法中,例如 setStatus(int sc)
和 sendError(int sc)
,以设置响应的状态码,向客户端传达请求处理的结果。
方法
addCookie(Cookie cookie)
: 添加一个Cookie
对象到响应中。containsHeader(String name)
: 检查响应中是否已存在指定名称的 HTTP 头。encodeURL(String url)
: 对 URL 进行编码,如果需要的话,会在 URL 中加入会话 ID。encodeRedirectURL(String url)
: 对重定向 URL 进行编码,如果需要的话,会在 URL 中加入会话 ID。sendError(int sc, String msg)
: 发送一个错误响应到客户端,包括指定的状态码和错误消息。sendError(int sc)
: 发送一个错误响应到客户端,只包括指定的状态码。sendRedirect(String location)
: 发送一个临时重定向响应到客户端,指定新的资源位置。setDateHeader(String name, long date)
: 设置一个日期头的值。addDateHeader(String name, long date)
: 添加一个日期头的值。setHeader(String name, String value)
: 设置一个头的值。addHeader(String name, String value)
: 添加一个头的值。setIntHeader(String name, int value)
: 设置一个整型头的值。addIntHeader(String name, int value)
: 添加一个整型头的值。setStatus(int sc)
: 设置响应的状态码。getStatus()
: 返回响应的状态码。getHeader(String name)
: 返回指定头的值。getHeaders(String name)
: 返回一个不可修改的集合,包含指定名称的所有头的值。getHeaderNames()
: 返回一个不可修改的集合,包含响应中所有头的名称。setTrailerFields(Supplier<Map<String, String>> supplier)
: 默认方法,设置一个供应商,它将在响应完成时提供尾部字段。getTrailerFields()
: 默认方法,返回一个供应商,它提供了响应的尾部字段。